问题: 1、在x坐标转换时,写汉字与写字母分别取x坐标的高四位x1和低四位x2,用了不同的算法,但写字母求x1、x2我弄不明白怎么取得高四位与低四位,我试验了可以正常运行。 2、这两种算法得到的x1、x2的值是不一样的,但为什么能正常运行。
下面是程序: - /*******************************************************************************
- * 函 数 名 : LCD12864_Write16CnCHAR
- * 函数功能 : 在12864上面书写16X16的汉字
- * 输 入 : x, y, cn
- * 输 出 : 无
- * 说 明 : 该函数可以直接书写字符串,但是书写是从右到左,所以输入的时
- * * 侯注意输入。汉字的取模方式请观看文件夹下的《汉字取模软件的
- * * 使用说明》
- ******************************************************************************/
- #ifdef CHAR_CODE
- #include"charcode.h"
- uchar Lcd12864_Write16CnCHAR(uchar x, uchar y, uchar *cn)
- {
- uchar j, x1, x2, wordNum;
- //--Y的坐标只能从0到7,大于则直接返回--//
- if(y > 7)
- {
- return 0;
- }
- //--X的坐标只能从0到128,大于则直接返回--//
- if(x > 128)
- {
- return 0;
- }
- y += 0xB0; //求取Y坐标的值
- //--设置Y坐标--//
- LcdSt7565_WriteCmd(y);
- while ( *cn != '\0') //在C语言中字符串结束以‘\0’结尾
- {
-
- //--设置Y坐标--//
- LcdSt7565_WriteCmd(y);
- x1 = (x >> 4) & 0x0F; //由于X坐标要两句命令,分高低4位,所以这里先取出高4位
- x2 = x & 0x0F; //去低四位
- //--设置X坐标--//
- 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坐标,当大于等于16时,切换坐标
- {
- //--设置Y坐标--//
- LcdSt7565_WriteCmd(y + 1);
-
- //--设置X坐标--//
- LcdSt7565_WriteCmd(0x10 + x1); //高4位
- LcdSt7565_WriteCmd(0x04 + x2); //低4位
- }
- LcdSt7565_WriteData(CN16CHAR[wordNum].Msk[j]);
- }
- x += 16;
- }//if查到字结束
- } //for查字结束
- cn += 2;
- } //while结束
- return 1;
- }
- /*这一个是写字母数字8*16*/
- uchar Lcd12864_Write8CnCHAR(uchar x, uchar y, uchar *cn)
- {
- uchar j, x1, x2, wordNum;
- //--Y的坐标只能从0到7,大于则直接返回--//
- if(y > 7)
- {
- return 0;
- }
- //--X的坐标只能从0到128,大于则直接返回--//
- if(x > 128)
- {
- return 0;
- }
- y += 0xB0; //求取Y坐标的值
- //--设置Y坐标--//
- LcdSt7565_WriteCmd(y);
- while ( *cn != '\0') //在C语言中字符串结束以‘\0’结尾
- {
-
- //--设置Y坐标--//
- LcdSt7565_WriteCmd(y);
- x1 = x/10; //由于X坐标要两句命令,分高低4位,所以这里先取出高4位
- x2 = x%10; //去低四位
- //--设置X坐标--//
- 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坐标,当大于等于16时,切换坐标
- {
- //--设置Y坐标--//
- LcdSt7565_WriteCmd(y + 1);
- //--设置X坐标--//
- LcdSt7565_WriteCmd(0x10 + x1); //高4位
- LcdSt7565_WriteCmd(0x04 + x2); //低4位
- }
- LcdSt7565_WriteData(CN8CHAR[wordNum].Msk[j]);
- }
- x += 8;
- }//if查到字结束
- } //for查字结束
- cn += 1;
- } //while结束
- return 1;
- }
复制代码
|