语法: lcd_load( buffer_pointer, offset, length);

发布于:2025-04-07 ⋅ 阅读:(25) ⋅ 点赞:(0)

LCD_LOAD()

语法:   lcd_load( buffer_pointer, offset, length);

参数:   buffer_pointer指向发送给LCD的用户数据;

        offset是用来将该数据写入LCD,用作进入LCD segment memory的偏移量;

        length是传送的字节数.

要求:   没有.

功能:   该函数将从CPU的buffer_pointer存储区取length个字节,装载到923/924 LCD的segment data area(段数据区),起始偏移量offset范围为0~15. LCD_symbol( )函数提供一个简易的方法将数据写入LCD segment memory(LCD段码存储区),这样,LCD就可显示数据了.

有效性: 该函数只对带有LCD驱动硬件的CPU器件有效;

要求:   常数被定义在devices.h的头文件中.

例子:   lcd_load( buffer, 0, 16 );

例子文件: ex_92lcd.c; 文件ex_92lcd.c如下:

#if defined( __PCM__ )  //若使用了PCM编译器,则defined( __PCM__)返回值为1

#include <16c924.h>    //包含16c924.h头文件

#fuses HS, NOWDT, PUT  //HS:高速晶振/谐振器, NOWDT:不使用WDT

                       // NOPROTECT:程序存储器代码不保护

#use delay(clock=20000000)  //使能内置函数的功能:delay_ms()和delay_us()

                         //#USE DELAY()必须在#use rs232()使用之前出现.

#endif    //结束if定义

// LCD Configuration(LCD配置)                        //

// Digit segments(数字段)  A     B        C       D        E       F        G       DP

//                      b7    b6       b5       b4       b3       b2       b1       b0

#define DIGIT4  COM1+26, COM1+17, COM2+17, COM3+26, COM2+25, COM1+25, COM2+26, COM3+17

#define DIGIT3  COM1+24, COM1+16, COM2+16, COM3+24, COM2+23, COM1+23, COM2+24, COM3+16

#define DIGIT2  COM1+22, COM1+19, COM2+19, COM3+22, COM2+21, COM1+21, COM2+22, COM3+19

#define DIGIT1  COM1+20, COM1+18, COM2+18, COM3+20, COM2+28, COM1+28, COM2+20, COM3+18

//         character         0    1    2    3    4    5    6    7    8    9

byte const Digit_Map[10] = {0xFC,0x60,0xDA,0xF2,0x66,0xB6,0xBE,0xE0,0xFE,0xE6};

#define BLANK 0  //用BLANK代替0

#define DASH 11   //用DASH代替11

byte lcd_pos;   //声明字节变量lcd_pos

void lcd_putc(char c) {

   byte segments;  //声明字节型暂态变量segments

   if(c=='\f')      // '\f'表示走纸换页

     lcd_pos=0;   //如果c是'\f'(走纸换页符),则将lcd_pos赋给0;

   else {

      if( (c>='0') && (c<='9') )   //若c是0~9的ASCII码值,则执行下面语句

         segments=Digit_Map[c-'0']; //根据c-'0' 的值查表,求得c对应LCD显示的代码值

      else

         segments=BLANK;  //若c不是0~9的ASCII码值,则将segments赋值为0

      switch(lcd_pos) {

        case 1 : lcd_symbol( segments, DIGIT4 ); break; // fill 1000s place

        case 2 : lcd_symbol( segments, DIGIT3 ); break; // fill  100s place

        case 3 : lcd_symbol( segments, DIGIT2 ); break; // fill   10s place

        case 4 : lcd_symbol( segments, DIGIT1 ); break; // fill    1s place

      }

   }

   lcd_pos++;

}

void main() {

   long number = 0;   //声明长整型变量number,并赋值为0

   setup_lcd( LCD_MUX14|STOP_ON_SLEEP, 2, ALL_LCD_PINS );

   while(TRUE) {

      printf(lcd_putc,"\f%4lu",number);

      if(number++==10000)

        number=0;

      delay_ms(100);   //延时100ms

   }

}