高级会员
 
主题
帖子
积分176
阅读权限30
注册时间2013-11-25
最后登录1970-1-1
在线时间 小时
|
互相帮助
- #include <reg52.h>
- #include <intrins.h>
- typedef unsigned char uchar;
- typedef unsigned int uint;
- /***********************字点阵码*************************/
- uchar code CharTable[]=
- {
- //0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,/*"黑屏"*/
- 0xFF,0xFF,0xFF,0xE7,0xDB,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xDB,0xE7,0xFF,0xFF,/*"0"*/
-
- 0xFF,0xFF,0xFF,0xEF,0x8F,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0x83,0xFF,0xFF,/*"1"*/
- 0xFF,0xFF,0xFF,0xC3,0xBD,0xBD,0xBD,0xFB,0xFB,0xF7,0xEF,0xDF,0xBD,0x81,0xFF,0xFF,/*"2"*/
- 0xFF,0xFF,0xFF,0xC3,0xBD,0xBD,0xFB,0xE7,0xFB,0xFD,0xFD,0xBD,0xBB,0xC7,0xFF,0xFF,/*"3"*/
- 0xFF,0xFF,0xFF,0xFB,0xF3,0xEB,0xDB,0xDB,0xBB,0xBB,0x81,0xFB,0xFB,0xE1,0xFF,0xFF,/*"4"*/
- 0xFF,0xFF,0xFF,0x81,0xBF,0xBF,0xBF,0xA7,0x9B,0xFD,0xFD,0xBD,0xBB,0xC7,0xFF,0xFF,/*"5"*/
- 0xFF,0xFF,0xFF,0xE3,0xDB,0xBF,0xBF,0xA7,0x9B,0xBD,0xBD,0xBD,0xDB,0xE7,0xFF,0xFF,/*"6"*/
- 0xFF,0xFF,0xFF,0x81,0xBB,0xBB,0xF7,0xF7,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xFF,0xFF,/*"7"*/
- 0xFF,0xFF,0xFF,0xC3,0xBD,0xBD,0xBD,0xDB,0xE7,0xDB,0xBD,0xBD,0xBD,0xC3,0xFF,0xFF,/*"8"*/
- 0xFF,0xFF,0xFF,0xE7,0xDB,0xBD,0xBD,0xBD,0xD9,0xE5,0xFD,0xFD,0xDB,0xC7,0xFF,0xFF,/*"9"*/
- };
- sbit RCK_595 = P2^0; //输出锁存器控制脉冲(L)
- sbit SCLK_595 = P2^1; //移位时钟脉冲(S)
- sbit Sdata_Red = P2^2; //串行数据输入(RED)
- sbit G_74138 = P2^4; //显示允许控制信号端口(EN)
- uint col;
- uchar code CharTable[];
- uchar Word, DispRow;
- uchar CharBuf[40];
- /**********************************************************
- 将显示数据送入74HC595内部移位寄存器
- **********************************************************/
- void WR_595(uchar buf)
- {
- uchar x;
-
- for (x=0; x<8; x++)
- {
- Sdata_Red=buf&0x80;
- buf = buf << 1; //数据左移一位
-
- SCLK_595 = 1; //上升沿发生移位
- _nop_();
- SCLK_595 = 0;
- }
- }
- /** Combine two byte to one byte to form shifting byte **/
- uchar two_onebyte(uchar h1,uchar h2)
- {
- uchar temp;
- temp=(h1<<col)|(h2>>(8-col)); //left shift
- return (temp);
- }
- /***************发送一线点阵数据*******************/
- void sendoneline()
- {
- uchar s,buf;
- for(s=0; s<16; s++) //need to be 16 for 1/4 scan time
- {
- G_74138 = 1; //打开显示
- buf=two_onebyte(CharBuf[s],CharBuf[s+4]);
- WR_595(buf); //load 8 bit into shift register LS595
- }
- P1 = P1&0xf0;
- RCK_595 = 1; //锁存数据
- _nop_();
-
- RCK_595 = 0;
- G_74138 = 0; //打开显示
- }
- /**************装载一线点阵数据****************/
- void loadoneline()
- {
- uchar s; //panel max display char plus 1, for 16x32 numeric display, s=4+1
- for(s=0;s<5;s++)
- {
- CharBuf[4*s+0] = CharTable[Word+(16*s+3*4)+DispRow];
- CharBuf[4*s+1] = CharTable[Word+(16*s+2*4)+DispRow];
- CharBuf[4*s+2] = CharTable[Word+(16*s+1*4)+DispRow];
- CharBuf[4*s+3] = CharTable[Word+(16*s+0*4)+DispRow];
- }
- }
- /**********************************************************
- 主函数
- **********************************************************/
- void main()
- {
- uchar i,SPEED;
- G_74138 = 0;
- col=0;
- Word=0;
- SPEED=20;
- P1=0;
-
- while(1)
- {
- while(col<8) //Already load max display char + 1, this routine is to shift one char
- //Total display will be max display char + 1, for 16x32, display char=5
- //After display total shifting char, it will point to next char
- {
- for(i=0;i<SPEED;i++)//汉字在屏幕上的停留时间(即移动速度快慢)
- {
- for (DispRow=0;DispRow<4;DispRow++) //扫描4行
- {
- loadoneline(); //装载一线点阵数据
- sendoneline(); //发送一线点阵数据
- P1=DispRow;
- }
- }
-
- col++; //列指针递增
- }
-
- col=0;
- Word=Word+16; //Point to next char and start loop again
-
-
- //Determine when to stop display
- //If Word >=16, display char=5
- //If Word >=32, display char=6
- //If Word >=48, display char=7
- //So, display char=(Wprd-16)/16+5
-
-
- if(Word>=32)
- Word=0;
- }
- }
复制代码
|
|