|
感谢 [email protected] 的代码。 程序已经测试正常。
以上为该 模块的 资料。
以下为原始代码。 - /*16*16点阵屏的显示*/
- #include <reg51.h>
- #include <intrins.h>
- #define DATE_OUT P2 //指定P2口做为输出
- sbit DATA=DATE_OUT^0; //列数据输出位
- sbit SCLH=DATE_OUT^1; //列扫描时钟位
- sbit SCLT=DATE_OUT^2; //列数据锁存位
- sbit AB =DATE_OUT^3; //行数据输出位
- sbit SCK =DATE_OUT^4; //行扫描时钟位
- unsigned char date[32]; //32字节RAM做为16*16点阵屏显示缓存
- void display(); //做为点阵扫描函数,将显示缓存的数据输出到点阵屏
- void display_time(unsigned int timer); //指定时间扫描显示
- code unsigned char zuo[32]={//左
- 0x02,0x00,0x02,0x00,0x02,0x08,0x0FF,0x0FC,
- 0x04,0x00,0x04,0x00,0x04,0x00,0x08,0x10,
- 0x0F,0x0F8,0x10,0x80,0x10,0x80,0x20,0x80,
- 0x40,0x80,0x80,0x84,0x7F,0x0FE,0x00,0x00};
- code unsigned char you[32]={//右
- 0x02,0x00,0x02,0x00,0x02,0x04,0x0FF,0x0FE,
- 0x04,0x00,0x04,0x00,0x08,0x00,0x08,0x08,
- 0x1F,0x0FC,0x28,0x08,0x48,0x08,0x88,0x08,
- 0x08,0x08,0x08,0x08,0x0F,0x0F8,0x08,0x08};
- code unsigned char sha[32]={//刹
- 0x20,0x84,0x11,0x84,0x0A,0x24,0x04,0x24,
- 0x0A,0x24,0x11,0x0A4,0x64,0x0A4,0x04,0x24,
- 0x0FF,0x0E4,0x04,0x24,0x15,0x24,0x14,0x84,
- 0x24,0x84,0x44,0x04,0x14,0x14,0x08,0x08};
- code unsigned char ting[32]={//停
- 0x10,0x80,0x10,0x48,0x17,0x0FC,0x20,0x00,
- 0x23,0x0F8,0x62,0x08,0x0A3,0x0F8,0x20,0x00,
- 0x2F,0x0FE,0x28,0x02,0x33,0x0F4,0x20,0x40,
- 0x20,0x40,0x20,0x40,0x21,0x40,0x20,0x80};
- void main(void)
- {
- unsigned char i=0,j=0;
- while(1)
- {
- for(i=0;i<32;i++)
- date[i]=zuo[i];//将"左"字数据复制到显示缓存
- display_time(2); //显示约2秒
- for(i=0;i<32;i++)
- date[i]=you[i];//将"右"字数据复制到显示缓存
- display_time(2); //显示约2秒
- for(i=0;i<32;i++)
- date[i]=sha[i];//将"刹"字数据复制到显示缓存
- display_time(2); //显示约2秒
- for(i=0;i<32;i++)
- date[i]=ting[i];//将"停"字数据复制到显示缓存
- display_time(2); //显示约2秒
- }
- }
- /* 显示函数 */
- void display()
- {
- unsigned char i,ia,j,tmp; //定义变量
- DATE_OUT=0XFF; //置位高电平做准备
- AB=0; //将行数据位清0,准备移位
- for(i=0;i<16;i++) //循环输出16行数据
- {
- SCK=0; //为行移位做准备
- SCLT=0; //为列锁存做准备
- for(ia=2;ia>0;) //每行16个点,循环位移两个字节
- {
- ia--; //循环两次
- tmp=~date[i*2+ia]; //读取点阵数据做输出,这里用到ia目的是先读取点阵数据的第二位字节,因一行16个点由两个字节组成,
- //电路中的移位寄存器最后一位对应最后一列,所以要先输出一行中的第二个字节数据
- for(j=0;j<8;j++) //循环两次,每次移一个字节,
- {
- SCLH=0; //为列移位做准备
- DATA=tmp&0x01; //将数据低位做输出,由电路图可知,移位寄存器的最后一位对应最后一列,因此先移最后一位
- tmp>>=1; //将数据缓冲右移一位,为下次输出做准备
- SCLH=1; //将DATA上的数据移入寄存器
- } //移入单字节结束
- } //移入两个字节结束
- DATE_OUT|=0X14; //此句可以用以下两句来理解,如果不将两句合为一句,将出现拖影现像
- //SCK=1; //SCK拉高,行数据移位,相应行拉低,三极管导通输出电量到相应行点阵管阳极(共阳)
- //SCLT=1; //SCLT拉高,将数据锁存输出到相应列的点阵发光管显示,显示一行后将保持到下一行显示开始
- AB=1; //行数据位只在第一行时为0,其它时候都为1,当将这个0移入寄存器后,从第一位开始一直移位最后一位,
- } //移位的过程,AB就必需是1,这是因为不能同时有两个及两个以上0的出现,否则显示出乱
- j=64;
- while(j--); //每一行的显示,保持两个字节的移位时间,因此,最后一行的显示,也要加入保持时间,补尝显示的亮度
- SCK=0; //
- SCK=1; //将最后一行数据移出
- }
- /* timer=1时,为1s左右的延时 */
- void display_time(unsigned int timer) //指定时间扫描显示
- {
- unsigned char i;
- while(timer--)
- {
- i=130;
- while(i--)
- display();
- }
- }
复制代码
这是我改的。。 好像还是 不对 - /*
- Blink
- Turns on an LED on for one second, then off for one second, repeatedly.
-
- This example code is in the public domain.
- */
-
- // Pin 13 has an LED connected on most Arduino boards.
- // give it a name:
- int led = 13;
- unsigned char i=0,j=0;
- //ck: P24
- //ab: P23
- //rck: P22
- //srcl:P21
- //ser: P20
- static const int DATA=9; //列数据输出位 灰
- static const int SCLH=10; //列扫描时钟位 紫
- static const int SCLT=11; //列数据锁存位 蓝
- static const int AB =12; //行数据输出位 绿
- //static const int SCK =13; //行扫描时钟位 黄
- unsigned char date[32]; //32字节RAM做为16*16点阵屏显示缓存
- void display(); //做为点阵扫描函数,将显示缓存的数据输出到点阵屏
- void display_time(unsigned int timer); //指定时间扫描显示
- unsigned char zuo[32]={//左
- 0x02,0x00,0x02,0x00,0x02,0x08,0x0FF,0x0FC,
- 0x04,0x00,0x04,0x00,0x04,0x00,0x08,0x10,
- 0x0F,0x0F8,0x10,0x80,0x10,0x80,0x20,0x80,
- 0x40,0x80,0x80,0x84,0x7F,0x0FE,0x00,0x00};
- unsigned char you[32]={//右
- 0x02,0x00,0x02,0x00,0x02,0x04,0x0FF,0x0FE,
- 0x04,0x00,0x04,0x00,0x08,0x00,0x08,0x08,
- 0x1F,0x0FC,0x28,0x08,0x48,0x08,0x88,0x08,
- 0x08,0x08,0x08,0x08,0x0F,0x0F8,0x08,0x08};
- unsigned char sha[32]={//刹
- 0x20,0x84,0x11,0x84,0x0A,0x24,0x04,0x24,
- 0x0A,0x24,0x11,0x0A4,0x64,0x0A4,0x04,0x24,
- 0x0FF,0x0E4,0x04,0x24,0x15,0x24,0x14,0x84,
- 0x24,0x84,0x44,0x04,0x14,0x14,0x08,0x08};
- unsigned char ting[32]={//停
- 0x10,0x80,0x10,0x48,0x17,0x0FC,0x20,0x00,
- 0x23,0x0F8,0x62,0x08,0x0A3,0x0F8,0x20,0x00,
- 0x2F,0x0FE,0x28,0x02,0x33,0x0F4,0x20,0x40,
- 0x20,0x40,0x20,0x40,0x21,0x40,0x20,0x80};
- // the setup routine runs once when you press reset:
- void setup() {
- // initialize the digital pin as an output.
- pinMode(led, OUTPUT);
- }
- // the loop routine runs over and over again forever:
- void loop() {
- digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
- delay(1000); // wait for a second
- digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
- delay(1000); // wait for a second
- show();
- }
- void high(int led){
- digitalWrite(led, HIGH);
- }
- void low(int led){
- digitalWrite(led, LOW);
- }
- void highAll(){
- high(DATA);
- high(SCLH);
- high(SCLT);
- high(AB);
- high(SCK);
- }
- void show( )
- {
-
-
- for(i=0;i<32;i++)
- date[i]=zuo[i];//将"左"字数据复制到显示缓存
- display_time(2); //显示约2秒
- for(i=0;i<32;i++)
- date[i]=you[i];//将"右"字数据复制到显示缓存
- display_time(2); //显示约2秒
- for(i=0;i<32;i++)
- date[i]=sha[i];//将"刹"字数据复制到显示缓存
- display_time(2); //显示约2秒
- for(i=0;i<32;i++)
- date[i]=ting[i];//将"停"字数据复制到显示缓存
- display_time(2); //显示约2秒
-
- }
- /* 显示函数 */
- void display()
- {
- unsigned char i,ia,j,tmp; //定义变量
- highAll();//DATE_OUT=0XFF; //置位高电平做准备
- low(AB);//AB=0; //将行数据位清0,准备移位
- for(i=0;i<16;i++) //循环输出16行数据
- {
- low(SCK);//SCK=0; //为行移位做准备
- low(SCLT);//SCLT=0; //为列锁存做准备
- for(ia=2;ia>0;) //每行16个点,循环位移两个字节
- {
- ia--; //循环两次
- tmp=~date[i*2+ia]; //读取点阵数据做输出,这里用到ia目的是先读取点阵数据的第二位字节,因一行16个点由两个字节组成,
- //电路中的移位寄存器最后一位对应最后一列,所以要先输出一行中的第二个字节数据
- for(j=0;j<8;j++) //循环两次,每次移一个字节,
- {
- low(SCLH);//SCLH=0; //为列移位做准备
- //DATA=tmp&0x01; //将数据低位做输出,由电路图可知,移位寄存器的最后一位对应最后一列,因此先移最后一位
- if(tmp&0x01==1){
- high(DATA);
- }else{
- low(DATA);
- }
- tmp>>=1; //将数据缓冲右移一位,为下次输出做准备
- high(SCLH);//SCLH=1; //将DATA上的数据移入寄存器
- } //移入单字节结束
- } //移入两个字节结束
- ////DATE_OUT|=0X14; //此句可以用以下两句来理解,如果不将两句合为一句,将出现拖影现像
- //SCK=1; //SCK拉高,行数据移位,相应行拉低,三极管导通输出电量到相应行点阵管阳极(共阳)
- //SCLT=1; //SCLT拉高,将数据锁存输出到相应列的点阵发光管显示,显示一行后将保持到下一行显示开始
- high(DATA);//AB=1; //行数据位只在第一行时为0,其它时候都为1,当将这个0移入寄存器后,从第一位开始一直移位最后一位,
- } //移位的过程,AB就必需是1,这是因为不能同时有两个及两个以上0的出现,否则显示出乱
- j=64;
- while(j--); //每一行的显示,保持两个字节的移位时间,因此,最后一行的显示,也要加入保持时间,补尝显示的亮度
- low(SCK);//SCK=0; //
- high(SCK);//SCK=1; //将最后一行数据移出
- }
- /* timer=1时,为1s左右的延时 */
- void display_time(unsigned int timer) //指定时间扫描显示
- {
- unsigned char i;
- while(timer--)
- {
- i=13000;
- while(i--)
- display();
- }
- }
复制代码 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|