|
|
- #include <REG52.H>
- #define uint unsigned int
- #define uchar unsigned char
- delay(uint i){ while(i--);}
- //12864引腳定義
- #define lcdDat P0 /* LCD12864 數(shù)據(jù)線 */
- sbit cs1= P2^3; /* 右屏片選,高電平有效 */
- sbit cs2= P2^4; /* 左屏片選,高電平有效 */
- sbit en = P2^0; /* 讀,寫使能,高電平有效,下沿鎖定數(shù)據(jù) */
- sbit rw = P2^1; /* 1讀\0寫 */
- sbit rs = P2^2; /* 1數(shù)據(jù)\0指令 */
- /** LCM忙檢測 **/
- busy12864(){
- lcdDat=0xff; //口線置1,防止干擾
- rs=0; rw=1; //置“命令、讀”模式
- //en=1; while(lcdDat&0x80); en=0;//忙等待
- }
- /** 寫命令 參數(shù):comDat為要發(fā)送的命令 **/
- WriteCom(uchar comDat){
- busy12864(); //忙,則等待
- rs=0;rw=0; //置“命令、寫”模式
- lcdDat=comDat;en=1;en=0;//送出命令,并使之有效
- }
- /** 寫數(shù)據(jù) 參數(shù):dat為要發(fā)送的數(shù)據(jù) **/
- WriteDat(uchar dat){
- busy12864(); //忙,則等待
- rs=1;rw=0; //置“數(shù)據(jù)、寫”模式
- lcdDat=dat;en=1;en=0; //送出數(shù)據(jù),并使之有效
- }
- //清屏函數(shù)
- void clrLCD(){
- uchar i,j;
- cs1=cs2=1; //同時選中左右屏
- for(i=0;i<8;i++){ //共8頁
- WriteCom(0xB8+i); //光標(biāo)到i頁
- WriteCom(0x40); //光標(biāo)到頁首
- for(j=0;j<64;j++)WriteDat(0); //寫0清屏
- }
- }
- /** 初始化12864 **/
- Init12864(){
- lcdDat=0xff; //口線置1,防止干擾
- rs=0; rw=1; //置“命令、讀”模式
- //en=1; while(lcdDat&0x10); en=0;//等待復(fù)位完成
- WriteCom(0x3f); //開顯示
- WriteCom(0xc0); //設(shè)置顯示起始行
- clrLCD(); //清屏
- }
- uchar code zm8x16_index[]="ABC"; //索引字串
- uchar code zm8x16_Table[][16]={ //字串字模
- 0xE0,0xF0,0x98,0x8C,0x98,0xF0,0xE0,0,15,15,0x0,0,0,15,15,0,//A
- 0x04,0xFC,0xFC,0x44,0x44,0xFC,0xB8,0, 8,15,0xF,8,8,15, 7,0,//B
- 0xF0,0xF8,0x0C,0x04,0x04,0x0C,0x18,0,0x03,7,0xC,8,8,12,6,0 //C
- };
- uchar code zm16x16_index[]="您好";//字串索引
- uchar code zm16x16_Table[][32]={ //字串字模
- 0x40,32,16,0xFC,0x23,16,0x8C,0x67,4,0xF4,4,0x44,0x94,0x8C,0,0,//您
- 64,48,0,0x77,0x80,0x81,0x88,0x92,0xB4,0x83,128,0xE0,0,17,96,0,
- 16,16,15,31,16,0xF0,128,130,130,130,0xE2,0x92,0x8A,0xC6,128,0,//好
- 0x40,0x22,0x15,0x08,0x14,0x63,0,0,0x40,0x80,0x7F,0x00,0,0,0,0
- };
- /******** 任意尺寸點陣顯示函數(shù) ***********|
- |參數(shù):顯示位置:row頁數(shù),col列號, |
- | 字符大小:x橫向像素,y縱向頁數(shù) |
- | 顯示內(nèi)容:tab字模表 ******/
- showXY(uchar row,uchar col,uchar x,uchar y,uchar *tab){
- uchar i,j;
- bit right;
- if(col<64){right=0;} //置左右屏標(biāo)志
- else {col-=64;right=1;}
- for(i=0;i<y;i++){
- if(right)cs1=0,cs2=1;
- else cs1=1,cs2=0;
- WriteCom(0xb8+row+i); //行
- WriteCom(0x40+col); //列
- for(j=0;j<x;j++){
- if(col+j<64)WriteDat(tab[i*x+j]); //未跨屏
- else if(right==0){ //從左屏跨右屏
- cs1=0,cs2=1; //選中右屏
- WriteCom(0xb8+row+i); //設(shè)置行
- WriteCom(0x40+(col+j-64));
- WriteDat(tab[i*x+j]);
- } //在右屏越界不顯示
- }
- }
- }
- /* 返回一個8*16字符索引位置 */
- uchar enN(uchar *s){
- uchar i;
- for(i=0;zm8x16_index[i]!=0;i++)if(zm8x16_index[i]==s[0])break;
- return i;
- }
- /* 返回一個16*16字符索引位置 */
- uchar cnN(uchar *s){
- uchar i;
- for(i=0;zm16x16_index[i]!=0;i+=2)
- if(zm16x16_index[i]==*s&&zm16x16_index[i+1]==*(s+1))break ;
- return i/2;
- }
- /* 顯示字符串 */
- void showStr(uchar row,uchar col,uchar *s){
- uchar i;
- for(i=0;s[i]!=0;i++){
- if(s[i]<0x80){ //英文
- showXY(row,col,8,2,zm8x16_Table[enN(&s[i])]);
- col+=8;
- }else{
- showXY(row,col,16,2,zm16x16_Table[cnN(&s[i])]);
- col+=16;i+=1;
- }
- if(col>120){ //換行處理
- col=0;
- row+=2;
- }
- }
- }
- void main(){
- Init12864(); //初始化
- showStr(0,0,"您好好ABC好");
- while(1);
- }
復(fù)制代碼 |
|