打印
[AVR单片机]

ICCAVR中关于常量数组的数组

[复制链接]
3975|4
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
不务正业|  楼主 | 2007-11-13 18:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
近日在写一个驱动LED点阵屏的程序, 程序中使用到字模数组, 同时还要做HEX到BCD的转换, 所以本想将字模定义成一个数组, 然后将BCD转换表也定义成数组, 在显示时通过BCD转换表查找到字模数组, 然后从字模数组中取出一行数据输出. 

在字模数组文件中如此定义:
_AUTOEXTERN const unsigned short array_0[_FONT_ARRAY_SIZE] = 
{ 0x1010,
0x0000,0x0000,0x03E0,0x0630,0x0C18,0x0C18,0x0C18,0x0C18,
0x0C18,0x0C18,0x0C18,0x0C18,0x0630,0x03E0,0x0000,0x0000};

_AUTOEXTERN const unsigned short array_1[_FONT_ARRAY_SIZE] = 
{ 0x1010,
0x0000,0x0000,0x0080,0x0380,0x0180,0x0180,0x0180,0x0180,
0x0180,0x0180,0x0180,0x0180,0x0180,0x03C0,0x0000,0x0000};


_AUTOEXTERN const unsigned short array_2[_FONT_ARRAY_SIZE] = 
{ 0x1010,
0x0000,0x0000,0x03C0,0x0660,0x0C30,0x0C30,0x0030,0x0030,
0x0060,0x00C0,0x0180,0x0310,0x0610,0x0FF0,0x0000,0x0000};

BCD转换表是这样定义的:
const unsigned short *const BCD_Tbl[] = { 
array_0,      array_1,         array_2,          array_3,      array_4,     array_5,    array_6,     array_7,     array_8,      array_9,
array_dian3,  array_mao4hao4,  array_jian3hao4,  array_nian2,  array_yue4,  array_ri4,  array_shi2,  array_fen1,  array_miao3,  array_wen1, 
array_du4,    array_shi1,      array_she4shi4,   array_bfh,    array_AllOff,     array_AllOn
};

...
unsigned char Screen[_SCREEN_SIZE] = {
19, 20, 11,         //温度:
};


在显示函数中我是这样用的:
void ShowScreen(unsigned char BlinkPos)
{
    static unsigned char LinePtr = 0;
    
    const unsigned short* pFont;        //当前字模指针
    unsigned char x_size, y_size;       //当前字模的水平方向和垂直方向的点数(数字与汉字可能不同)
    unsigned short fontLine, temp;            //保存字模的当前行的数据
    unsigned char n, i;
        ....    

    //串行输出列数据
    for(n = 0; n < _SCREEN_SIZE; ++n)
    {
        pFont = BCD_Tbl[Screen[n]];    //Screen数组里面存的是要显示的数字和汉字信息相当于地址码吧
        x_size = (pFont[0] & 0xFF00) >> 8;    //字模中的第一个元素是字模的宽度和高度停息
        y_size = (pFont[0] & 0x00FF);
        fontLine = pFont[LinePtr + 1];    //本以为这里取出的就是字模中的一行数据, 可实际上不是, 请问各位高手, 问题究竟出在哪里呀?
.....
    

相关帖子

沙发
不务正业|  楼主 | 2007-11-13 21:03 | 只看该作者

为什么没有人回答呀?

使用特权

评论回复
板凳
不务正业|  楼主 | 2007-11-14 11:07 | 只看该作者

自己来回答

代码应该没问题, 现在可以按我预想的那样显示汉字了, 可就是没搞明白刚开始时为啥没显示出来. 见鬼了!!!!  要么是我机器中毒了!!!!!!!
在代码上调了一天多了, 最终结论是没问题, 鼻子都要气歪了!!!!!!!

使用特权

评论回复
地板
不务正业|  楼主 | 2007-11-14 11:15 | 只看该作者

更正其中一个错误

    for(n = 0; n < _SCREEN_SIZE; ++n)
    {
        pFont = BCD_Tbl[Screen[n]];
        x_size = (pFont[0] & 0xFF00) >> 8;
        y_size = (pFont[0] & 0x00FF);
        
        //如果字模高度小于屏的垂直方向的点数
        if(y_size >= LinePtr)
            fontLine = pFont[LinePtr + 1];
        else
            fontLine = 0;
        
        ......

使用特权

评论回复
5
不务正业|  楼主 | 2007-11-14 11:21 | 只看该作者

另外发现 AVRStudio4.13 sp1好像有点问题

我这个ShowScreen函数是在定时器2的中断中调用的, 调试时发现有些变量的watch值不正确(也可能是我的代码有问题) 比如 pFont[0]值为 0x1010可算出的 y_size 却显示成 150 或是其他的什么数, 我通过修改字模的长宽值与显示效果对照来看, 字模高度值是取对了的, 可就是不明白调试时怎么不对, 害死人呀. ICCAVR? JTAG? 还是 AVRStudio? 我的代码? 硬件? 究竟该怀疑谁.........

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

7

帖子

1

粉丝