/*-----------------------------------------------
名稱:16x16漢字屏流動顯示
修改:無
硬件:LY-51S V4.0 單片機開發板
內容:
P1.0-P1.3分別連接A、B、C、D,用于控制16行,通過2路HC138控制
SER接P1.4 通過2片HC595控制
CLK時鐘連接P1.5
LAT鎖存連接P1.6
OE接P1.7
現象:使用普通速度51系列單片機。1個漢字顯示屏,向左流動顯示多個漢字,重復循環顯示。
------------------------------------------------*/
#include<reg52.h>
sbit J32_LAT = P1^6; //鎖存引腳
sbit J32_SER = P1^4; //數據引腳
sbit J32_CLK = P1^5; //時鐘引腳
sbit J32_OE = P1^7; //使能引腳
unsigned char MoveBitNum,MoveBitNumtemp,IncNum;//移動位數,臨時移動位數,大于一個字節增加字節數
unsigned int HzNum;//漢字個數
unsigned char buff[10];
/*-----------------------------------------------
16x16漢字取模數據
------------------------------------------------*/
unsigned char code hztest[][32]= //取模選擇字節正序
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //前面一屏大小的空字符,不顯示,這里根據屏的大小修改,這個是1個漢字屏
//所以寫入1個漢字
/*-- 文字: 湖 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x01,0x00,0x21,0x1E,0x11,0x12,0x17,0xD2,0x81,0x12,0x41,0x1E,0x41,0x12,0x17,0xD2,
0x14,0x52,0x24,0x5E,0xE4,0x52,0x27,0xD2,0x24,0x52,0x20,0x22,0x20,0x2A,0x00,0x44,
/*-- 文字: 北 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x04,0x40,0x04,0x40,0x04,0x40,0x04,0x44,0x04,0x48,0x7C,0x50,0x04,0x60,0x04,0x40,
0x04,0x40,0x04,0x40,0x04,0x40,0x04,0x42,0x1C,0x42,0xE4,0x42,0x44,0x3E,0x04,0x00,
/*-- 文字: 汽 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x01,0x00,0x21,0x00,0x11,0xFC,0x12,0x00,0x84,0x00,0x41,0xF8,0x48,0x00,0x08,0x00,
0x13,0xF8,0x10,0x08,0xE0,0x08,0x20,0x08,0x20,0x0A,0x20,0x0A,0x20,0x06,0x00,0x02,
/*-- 文字: 車 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x02,0x00,0x02,0x00,0x02,0x00,0x7F,0xFC,0x04,0x00,0x09,0x00,0x11,0x00,0x21,0x00,
0x3F,0xF8,0x01,0x00,0x01,0x00,0xFF,0xFE,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
/*-- 文字: 工 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x00,0x00,0x00,0x00,0x7F,0xFC,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,
0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0xFF,0xFE,0x00,0x00,0x00,0x00,
/*-- 文字: 業 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x04,0x40,0x04,0x40,0x04,0x40,0x04,0x40,0x44,0x44,0x24,0x44,0x24,0x48,0x14,0x48,
0x14,0x50,0x14,0x60,0x04,0x40,0x04,0x40,0x04,0x40,0x04,0x40,0xFF,0xFE,0x00,0x00,
/*-- 文字: 學 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x22,0x08,0x11,0x08,0x11,0x10,0x00,0x20,0x7F,0xFE,0x40,0x02,0x80,0x04,0x1F,0xE0,
0x00,0x40,0x01,0x80,0xFF,0xFE,0x01,0x00,0x01,0x00,0x01,0x00,0x05,0x00,0x02,0x00,
/*-- 文字: 院 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x00,0x40,0x78,0x20,0x4B,0xFE,0x52,0x02,0x54,0x04,0x61,0xF8,0x50,0x00,0x48,0x00,
0x4B,0xFE,0x48,0x90,0x68,0x90,0x50,0x90,0x41,0x12,0x41,0x12,0x42,0x0E,0x44,0x00,
/*-- 文字: 科 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x08,0x10,0x1D,0x10,0xF0,0x90,0x10,0x90,0x10,0x10,0xFD,0x10,0x10,0x90,0x38,0x90,
0x34,0x10,0x50,0x1E,0x53,0xF0,0x90,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
/*-- 文字: 技 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x10,0x20,0x10,0x20,0x10,0x20,0x13,0xFE,0xFC,0x20,0x10,0x20,0x10,0x20,0x15,0xFC,
0x18,0x84,0x30,0x88,0xD0,0x48,0x10,0x50,0x10,0x20,0x10,0x50,0x51,0x88,0x26,0x06,
/*-- 文字: 學 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x22,0x08,0x11,0x08,0x11,0x10,0x00,0x20,0x7F,0xFE,0x40,0x02,0x80,0x04,0x1F,0xE0,
0x00,0x40,0x01,0x80,0xFF,0xFE,0x01,0x00,0x01,0x00,0x01,0x00,0x05,0x00,0x02,0x00,
/*-- 文字: 院 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x00,0x40,0x78,0x20,0x4B,0xFE,0x52,0x02,0x54,0x04,0x61,0xF8,0x50,0x00,0x48,0x00,
0x4B,0xFE,0x48,0x90,0x68,0x90,0x50,0x90,0x41,0x12,0x41,0x12,0x42,0x0E,0x44,0x00,
/*-- 文字: K --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0xEE,0x00,0x44,0x00,0x48,0x00,0x50,0x00,0x70,0x00,
0x50,0x00,0x48,0x00,0x48,0x00,0x44,0x00,0x44,0x00,0xEE,0x00,0x00,0x00,0x00,0x00,
/*-- 文字: 電 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x01,0x00,0x01,0x00,0x01,0x00,0x3F,0xF8,0x21,0x08,0x21,0x08,0x21,0x08,0x3F,0xF8,
0x21,0x08,0x21,0x08,0x21,0x08,0x3F,0xF8,0x21,0x0A,0x01,0x02,0x01,0x02,0x00,0xFE,
/*-- 文字: 信 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x08,0x40,0x08,0x20,0x0B,0xFE,0x10,0x00,0x10,0x00,0x31,0xFC,0x30,0x00,0x50,0x00,
0x91,0xFC,0x10,0x00,0x10,0x00,0x11,0xFC,0x11,0x04,0x11,0x04,0x11,0xFC,0x11,0x04,
/*-- 文字: 1 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x38,0x00,0x08,0x00,0x08,0x00,0x08,0x00,
0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,
/*-- 文字: 5 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x00,0x40,0x00,0x40,0x00,0x40,0x00,0x78,0x00,
0x44,0x00,0x02,0x00,0x02,0x00,0x42,0x00,0x44,0x00,0x38,0x00,0x00,0x00,0x00,0x00,
/*-- 文字: 1 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x38,0x00,0x08,0x00,0x08,0x00,0x08,0x00,
0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x08,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,
/*-- 文字: 龔 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x04,0x20,0x04,0x10,0x7F,0xFC,0x09,0x20,0x09,0xC4,0x17,0x04,0x20,0xFC,0xC4,0x40,
0x04,0x40,0x3F,0xF8,0x04,0x40,0x04,0x40,0xFF,0xFE,0x08,0x20,0x10,0x10,0x20,0x08,
/*-- 文字: 俊 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x08,0x40,0x08,0x40,0x08,0x88,0x11,0x04,0x13,0xFE,0x30,0x02,0x30,0x88,0x51,0x44,
0x92,0x42,0x10,0xF8,0x11,0x88,0x12,0x50,0x10,0x20,0x10,0x50,0x11,0x88,0x16,0x06,
/*-- 文字: 宇 --*/
/*-- 宋體12; 此字體下對應的點陣為:寬x高=16x16 --*/
0x02,0x00,0x01,0x00,0x7F,0xFE,0x40,0x02,0x80,0x04,0x3F,0xF8,0x01,0x00,0x01,0x00,
0x01,0x00,0xFF,0xFE,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x05,0x00,0x02,0x00,
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, //尾部的一屏的空字符,用于清屏,參數和屏大小有關。
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};
/*-----------------------------------------------
向595寫入一個字節 單紅色
------------------------------------------------*/
void InputByte( unsigned char DataR1) //寫一個字節
{
unsigned char i;
for(i=8; i>0; i--)
{
J32_SER = (DataR1&0x01);
J32_CLK = 0;
J32_CLK = 1;
DataR1 = DataR1 >> 1;
}
}
/*-----------------------------------------------
延時程序
------------------------------------------------*/
void Delay(unsigned int t)
{
while(--t);
}
/*-----------------------------------------------
主程序
------------------------------------------------*/
main()
{
unsigned char count;//16行掃描數據,范圍0-15
unsigned int i, j;
unsigned char temp;
//計算數組的元素個數,最終需要的是漢字的個數
int lenTotal = sizeof(hztest) / sizeof(int); //所有
int lenLow = sizeof(hztest[0]) / sizeof(int); //低位
int lenHigh = lenTotal / lenLow; //高位
while(1)
{
i++;
if(i==240)//更改流動速度,1T單片機和12T單片機速度大約5-8倍,注意更改參數
{
i=0;
MoveBitNum++;
if(MoveBitNum==16)//每次移動完一個漢字大小后循環
{
MoveBitNum=0;
HzNum+=1; //調用下一個漢字
if(HzNum>=lenHigh-1)//需要顯示的漢字個數,包括前面的一屏空字符的個數,后面清屏的空字符不包含在內,這里是(漢字個數+1)
HzNum=0; //完全顯示完后循環調用
}
}
Delay(1);//控制掃描頻率
//讀取漢字對應屏幕緩沖區的數據,不同大小的屏幕不一樣
for(j=0; j<2; j++) //取每個漢字的前2個字節,
{
//漢字個數+1
buff[j+j+1]=hztest[HzNum+j][count+count+1]; //每次移動完一個漢字后,選擇下一個漢字
buff[j+j]=hztest[HzNum+j][count+count];
}
//判斷移動的位數
if(MoveBitNum<8) // 判讀移動距離是大于一個字節還是小于一個字節,因為一個字節左移右移最大只能8位
{
IncNum=0;
MoveBitNumtemp=MoveBitNum;
}
else
{
IncNum=1; //大于8就減去8得到的數值還是小于8
MoveBitNumtemp=MoveBitNum-8;
}
J32_LAT=0; //鎖存無效
for(j=2; j>0; j--) //按bit的方式移動緩沖區的內容,然后輸出到595,即取出的數值每個字節左移一定的位數,
{
//后面左移出的數據整合到前面的字節中,保持數據的連續性
temp=(buff[j-1+IncNum]<<MoveBitNumtemp)|(buff[j+IncNum]>>(8-MoveBitNumtemp));//這句比較重要,需要自行拿出2個字節的數據模擬分析
InputByte(temp);//輸出到595
}//8個字節傳輸完鎖存輸出
//控制使能端
J32_OE = 1;
P1=count;//用P0口的前4位控制16行,屏內部通過4-16譯碼器工作,循環掃描16行
J32_LAT=1; //鎖存有效,此時一行的數據顯示到屏上
J32_OE = 0;
count++;
if(count==16)
count=0;
}
}
|