問題: 1、在x坐標(biāo)轉(zhuǎn)換時,寫漢字與寫字母分別取x坐標(biāo)的高四位x1和低四位x2,用了不同的算法,但寫字母求x1、x2我弄不明白怎么取得高四位與低四位,我試驗了可以正常運行。 2、這兩種算法得到的x1、x2的值是不一樣的,但為什么能正常運行。
下面是程序: - /*******************************************************************************
- * 函 數(shù) 名 : LCD12864_Write16CnCHAR
- * 函數(shù)功能 : 在12864上面書寫16X16的漢字
- * 輸 入 : x, y, cn
- * 輸 出 : 無
- * 說 明 : 該函數(shù)可以直接書寫字符串,但是書寫是從右到左,所以輸入的時
- * * 侯注意輸入。漢字的取模方式請觀看文件夾下的《漢字取模軟件的
- * * 使用說明》
- ******************************************************************************/
- #ifdef CHAR_CODE
- #include"charcode.h"
- uchar Lcd12864_Write16CnCHAR(uchar x, uchar y, uchar *cn)
- {
- uchar j, x1, x2, wordNum;
- //--Y的坐標(biāo)只能從0到7,大于則直接返回--//
- if(y > 7)
- {
- return 0;
- }
- //--X的坐標(biāo)只能從0到128,大于則直接返回--//
- if(x > 128)
- {
- return 0;
- }
- y += 0xB0; //求取Y坐標(biāo)的值
- //--設(shè)置Y坐標(biāo)--//
- LcdSt7565_WriteCmd(y);
- while ( *cn != '\0') //在C語言中字符串結(jié)束以‘\0’結(jié)尾
- {
-
- //--設(shè)置Y坐標(biāo)--//
- LcdSt7565_WriteCmd(y);
- x1 = (x >> 4) & 0x0F; //由于X坐標(biāo)要兩句命令,分高低4位,所以這里先取出高4位
- x2 = x & 0x0F; //去低四位
- //--設(shè)置X坐標(biāo)--//
- LcdSt7565_WriteCmd(0x10 + x1); //高4位
- LcdSt7565_WriteCmd(0x04 + x2); //低4位
- for (wordNum=0; wordNum<50; wordNum++)
- {
- //--查詢要寫的字在字庫中的位置--//
- if ((CN16CHAR[wordNum].Index[0] == *cn)
- &&(CN16CHAR[wordNum].Index[1] == *(cn+1)))
- {
- for (j=0; j<32; j++) //寫一個字
- {
- if (j == 16) //由于16X16用到兩個Y坐標(biāo),當(dāng)大于等于16時,切換坐標(biāo)
- {
- //--設(shè)置Y坐標(biāo)--//
- LcdSt7565_WriteCmd(y + 1);
-
- //--設(shè)置X坐標(biāo)--//
- LcdSt7565_WriteCmd(0x10 + x1); //高4位
- LcdSt7565_WriteCmd(0x04 + x2); //低4位
- }
- LcdSt7565_WriteData(CN16CHAR[wordNum].Msk[j]);
- }
- x += 16;
- }//if查到字結(jié)束
- } //for查字結(jié)束
- cn += 2;
- } //while結(jié)束
- return 1;
- }
- /*這一個是寫字母數(shù)字8*16*/
- uchar Lcd12864_Write8CnCHAR(uchar x, uchar y, uchar *cn)
- {
- uchar j, x1, x2, wordNum;
- //--Y的坐標(biāo)只能從0到7,大于則直接返回--//
- if(y > 7)
- {
- return 0;
- }
- //--X的坐標(biāo)只能從0到128,大于則直接返回--//
- if(x > 128)
- {
- return 0;
- }
- y += 0xB0; //求取Y坐標(biāo)的值
- //--設(shè)置Y坐標(biāo)--//
- LcdSt7565_WriteCmd(y);
- while ( *cn != '\0') //在C語言中字符串結(jié)束以‘\0’結(jié)尾
- {
-
- //--設(shè)置Y坐標(biāo)--//
- LcdSt7565_WriteCmd(y);
- x1 = x/10; //由于X坐標(biāo)要兩句命令,分高低4位,所以這里先取出高4位
- x2 = x%10; //去低四位
- //--設(shè)置X坐標(biāo)--//
- LcdSt7565_WriteCmd(0x10 + x1); //高4位
- LcdSt7565_WriteCmd(0x04 + x2); //低4位
- for (wordNum=0; wordNum<50; wordNum++)
- {
- //--查詢要寫的字在字庫中的位置--//
- if ((CN8CHAR[wordNum].Index == *cn))
- {
- for (j=0; j<16; j++) //寫一個字
- {
- if (j == 8) //由于16X16用到兩個Y坐標(biāo),當(dāng)大于等于16時,切換坐標(biāo)
- {
- //--設(shè)置Y坐標(biāo)--//
- LcdSt7565_WriteCmd(y + 1);
- //--設(shè)置X坐標(biāo)--//
- LcdSt7565_WriteCmd(0x10 + x1); //高4位
- LcdSt7565_WriteCmd(0x04 + x2); //低4位
- }
- LcdSt7565_WriteData(CN8CHAR[wordNum].Msk[j]);
- }
- x += 8;
- }//if查到字結(jié)束
- } //for查字結(jié)束
- cn += 1;
- } //while結(jié)束
- return 1;
- }
復(fù)制代碼
|