文件见附件这是我的代码
- #include<reg51.h>
- #include<intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- uchar code num[4][32]={ {0xFE,0xFF,0xFE,0xFB,0x00,0x01,0xFE,0xFF,0xFD,0xFF,0xC0,0x03,0xDB,0xDB,0xDD,0xBB,0xD0,0x0B,0xDE,0xFB,0xC0, 0x03,0xDE,0xFB,0xDE,0xFB,0xDE,0xEB,0xDE,0xF7,0xFF,0xFF},/*"南",0*/
- {0xFD,0xFF,0xFE,0xF7,0x80,0x03,0xFF,0xFF,0xFF,0xFF,0xE0,0x0F,0xEF,0xEF,0xEF,0xEF,0xE0,0x0F,0xFE,0xFF,0xF6, 0xCF,0xE6,0xE7,0xCE,0xF3,0xBE,0xF7,0xFA,0xFF,0xFD,0xFF},/*"京",1*/
- {0xFF,0xFF,0xC0,0x03,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE, 0xFF,0xFE,0xFF,0xFE,0xFF,0x00,0x01,0xFF,0xFF,0xFF,0xFF},/*"工",2*/
- {0xF2,0x07,0x8E,0xF7,0xEE,0xF7,0xEE,0xF7,0x02,0xF7,0xEE,0x07,0xCF,0xFF,0xC4,0x03,0xAB,0xBF,0xAF,0xBF,0x6C, 0x03,0xEF,0xBF,0xEF,0xBF,0xEF,0xBF,0xE8,0x01,0xEF,0xFF}/*"程",3*/
- };
- uchar idatanum_temp[16][8]; //数据缓存,用于移位
- uchar b[8]; //16*16点阵,每次发送1个字节。用b[8]保存
- int n1=0;
- uchar zuoyou=0;
- uchar hanzi;
- sbit EN=P1^0; //74hc154的使能端
- sbit A_R=P2^0; //A B C D每位数据对应于74hc154的4个数据口
- sbit B_R=P2^1;
- sbit C_R=P2^2;
- sbit D_R=P2^3;
- sbit RST_C=P1^1; //74hc595的复位口
- sbit DATA_C=P3^2; //串行数据口
- sbit SRC_C=P3^3; //74hc595的寄存器时钟线
- sbit SLC_C=P3^4; //74hc595的锁存器的时钟线
- /*************************************
- 函数功能:延时程序
- **************************************/
- void delay(int i)
- {
- int a;
- for(a=0;a<i;a++);
- }
- /**************************************************************
- 函数功能: 595在SLC上升沿的时候并行输出到寄存器下的8位数据
- 入口参数:无
- 返回值 :无
- **************************************************************/
- void SLC_595()
- {
- SLC_C=0;
- SLC_C=1;
- SLC_C=0;
- }
- /**************************************************************
- 函数功能:往num_temp[16][8]暂存器下存储数据 16对应着16个字节
- *************************************************************/
- void hanziku()
- {
- int i,j=0,k;
- for(i=0;i<16;i++){
- b[0]=num[0][j];b[2]=num[1][j];b[4]=num[2][j];b[6]=num[3][j];
- j++;
- b[1]=num[0][j];b[3]=num[1][j];b[5]=num[2][j];b[7]=num[3][j];
- j++;
- for(k=7;k>=0;k--){
- num_temp[ i][k]=b[k];
- }
- }
- }
- /*******************************************************************
- 函数功能: 595输出列向的数据64个(8位为一字节,那就是8字节的数据)
- 入口参数: 无
- 返回值 :无
- *******************************************************************/
- //右移
- void column_zuoyi(int n)
- {
- int i,j,e=0,f;
- uchar a1,b1;
- for(i=7;i>=0;i--){
- f=e;
- e=num_temp[n][ i]&0x80;
- num_temp[n][ i]<<=1;
- if(f){
- num_temp[n][ i]=num_temp[n][ i]+0x01;
- }
- b1=num_temp[n][ i];
- for(j=0;j<8;j++){
- a1=0x01;
- SRC_C=0;
- DATA_C=b1&a1;
- b1>>=1;
- SRC_C=1;
- }
- }
- }
- //左移
- void column_youyi(int n)
- {
- int i,j,e=0,f;
- uchar a1,b1;
- for(i=7;i>=0;i--){
- if(i!=0)
- {
- f=num_temp[n][i-1]&0x01;
- }
- else
- {
- f=0;
- }
- num_temp[n][ i]>>=1;
- if(f)
- {
- num_temp[n][ i]=num_temp[n][ i]+0x80;
- }
- b1=num_temp[n][ i];
- for(j=0;j<8;j++){
- a1=0x01;
- SRC_C=0;
- DATA_C=b1&a1;
- b1>>=1;
- SRC_C=1;
- }
- }
- }
- //静止
- void column_stop(int n)
- {
- int i,j;
- uchar a1,b1;
- for(i=7;i>=0;i--){
- b1=num_temp[n][ i];
- for(j=0;j<8;j++){
- a1=0x01;
- SRC_C=0;
- DATA_C=b1&a1;
- b1>>=1;
- SRC_C=1;
- }
- }
- }
- /**********************************************
- 函数功能:行扫描程序,16次为1个周期,利用154的译码器
- 入口参数:无
- 返回值: 无
- ***********************************************/
- void column_16()
- {
- int i,j=0;
- char temp=0x00;
- //这里输入行数据en打开
- n1++;
- //对应16行数据
- for(i=0;i<16;i++)
- {
- switch(zuoyou)
- {
- case 0:
- if(hanzi==0)
- {
- hanziku();
- }
- hanzi++;
- column_stop(i);
- break;
- case 1:
- column_zuoyi(i);
- hanzi=0;
- break;
- case 2:
- if(hanzi==0)
- {
- hanziku();
- }
- hanzi++;
- column_stop(i);
- break;
- case 3:
- column_youyi(i);
- hanzi=0;
- break;
- }
- if(n1==70)
- {
- n1=0;
- zuoyou++;
- if(zuoyou==4)
- {
- zuoyou=0;
- }
- }
- EN=0;
- //每一行的数据
- P2=temp++; //P2从0000开始到1111
- SLC_595();
- }
- }
- int main()
- {
- int i=0;
- EN=1; //154使能端关上
- SRC_C=0; //595初始化
- SLC_C=0;
- hanziku(); //初始化汉字库
- while(1){
- column_16();
- delay(5);
- EN=1;
- }
- }
复制代码
|