您的位置:首页 > 编程语言 > PHP开发

LCD驱动芯片1335控制器C51源程

2010-01-22 16:53 246 查看
整理硬盘资料,看见的一段代码。贴上来备份

//LCD驱动芯片1335控制器C51源程
//
/*include files */
#include "w78e58.h"
//#include "zimo.h" //这是自己做的一个汉字库,
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include "absacc.h"
#include "intrins.h"
#include "string.h"
/*define function*/
#define HIBYTE(V1) ((BYTE)((V1)>>8))
#define LOBYTE(V1) ((BYTE)((V1)&0Xff))
#define MAKEWORD(V1,V2) ((((WORD)(V1))<<8)+(WORD)(V2))
/*define SED1335 port address*/
#define SEDWRCOM XBYTE[0X1100] //写指令代码
#define SEDRDCSR XBYTE[0X1100] //读光标指针
#define SEDWRDAT XBYTE[0X1000] // 写指令参数和显示数据
/*define LCD code */
#define SYSSET 0x40
#define SCROLL 0x44
#define SLEEP 0x53
#define DISPON 0x59
#define DISPOFF 0x58
#define OVLAY 0x5b
#define HDOTSCR 0x5a
#define CSRFORM 0x5d
#define CGRAMADR 0x5c
#define CSRRGT 0x4c
#define CSRLFT 0x4d
#define CSRUP 0x4e
#define CSRDOWN 0x4f
#define CSRW 0x46
#define CSRR 0x47
#define MWRITE 0x42
#define MREAD 0x43
#define AP 30
/*define screen flag*/
BOOL FG_FIRST = 0;
BOOL FG_MAIN = 0;
BOOL FG_PWD = 0;
BOOL FG_PRG = 0;
BOOL FG_PRG1 = 0;
BOOL FG_PRG2 = 0;
BOOL FG_PRG3 = 0;
BOOL FG_CYCLE = 0;
BOOL FG_LIMIT = 0;
BOOL FG_TIME = 0;
BOOL FG_INPUT = 0;
BOOL FG_OUTPUT = 0;
BOOL FG_PID = 0;
BOOL FG_SELFCTL = 0;
BOOL FG_VARY = 0;
/*LCD initial parameters*/
BYTE code SYSTAB[8] = {0x30, 0x87, 0x0f, 0x1d, 0x4c, 0xa0, 0x1e, 0x00};
BYTE code SCRTAB[10] = {0x00, 0x00, 0xa0, 0x00, 0x40, 0xa0, 0x00, 0x80, 0x00, 0x00};
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*START OF THE PROGRAME*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/

/*SBUROUTINES OF LCD DRIVE*/
void WLCDCOM (BYTE com )
//写LCD控制命令
{
SEDWRCOM = com;
_nop_();
}
void WLCDDATA (BYTE ref )
//写LCD控制参数和显示字符数据
{
SEDWRDAT = ref;
_nop_();
}
void CLRVRAM (void)
//显示存储器清零
{
WORD i, j;
WLCDCOM (CSRRGT);
WLCDCOM (CSRW);
WLCDDATA (0x00);
WLCDDATA (0x00);
WLCDCOM (MWRITE);
for (i = 0; i <= 0xff; i++)
{
for (j = 0; j <= 0xff; j++)
{
WLCDDATA (0x00);
}
}
}
void CLRSCREEN (void)
//清除显示屏幕
{
WORD i, j;
WLCDCOM (CSRRGT);
WLCDCOM (CSRW);
WLCDDATA (0X00);
WLCDDATA (0X00);
WLCDCOM (MWRITE);
for (i = 0; i < 0xa0; i++)
{
for (j = 0; j
{
WLCDDATA (0x00);
}
}
}
void WNUMBER (BYTE x, BYTE y, BYTE (*p) [16], BYTE num )
//功能:显示0~9等10个数字,num为要显示的数字的值(16×8)
//x坐标寄存器(字节),y坐标寄存器(点行)
{
WORD temp;
BYTE hi, lo;
BYTE a, b, c;
temp = y * AP;
hi = HIBYTE (temp);
lo = LOBYTE (temp);
lo = x + lo;
if (CY == 1) {hi += 0x01; CY = 0;}
WLCDCOM (CSRDOWN);
WLCDCOM (CSRW);
WLCDDATA (lo);
WLCDDATA (hi);
WLCDCOM (MWRITE);
for (c = 0; c < 16; c++)
{
WLCDDATA (* (* (p + num) + c) );
}
lo = lo + 0x01;
if (CY == 1) {hi += 0x01; CY = 0;}
}
void WBLOCK (BYTE x, BYTE y, BYTE (*p) [16], BYTE num )
//功能:显示16×8点字符,num为要显示的字符块长度
//x坐标为低8位寄存器(字节),y坐标寄存器(点行)
{
WORD temp;
BYTE hi, lo;
BYTE a, b, c;
temp = y * AP;
hi = HIBYTE (temp);
lo = LOBYTE (temp);
lo = x + lo;
if (CY == 1) {hi += 0x01; CY = 0;}
WLCDCOM (CSRDOWN);
WLCDCOM (CSRW);
WLCDDATA (lo);
WLCDDATA (hi);
WLCDCOM (MWRITE);
for (c = 0; c < 16; c++)
{
WLCDDATA (* (* (p + num - 1) + c) );
}
lo = lo + 0x01;
if (CY == 1) {hi += 0x01; CY = 0;}
}
void FILLBLOCK (BYTE x, BYTE y, BYTE len )
//功能:显示16×16字符,len为要显示的字符块的长度
//x坐标为低8位寄存器(字节),y坐标寄存器(点行)
{
WORD temp;
BYTE hi, lo;
BYTE a, b;
temp = y * AP;
hi = HIBYTE (temp);
lo = LOBYTE (temp);
lo = x + lo;
if (CY == 1) {hi += 0x01; CY = 0;}
for (b = 0; b
{
WLCDCOM (CSRDOWN);
WLCDCOM (CSRW);
WLCDDATA (lo);
WLCDDATA (hi);
WLCDCOM (MWRITE);
for (a = 0; a < 16; a++)
{
WLCDDATA (0xff);
}
lo = lo + 0x01;
if (CY == 1) {hi += 0x01; CY = 0;}
}
}
void CLRBLOCK (BYTE x, BYTE y, BYTE len )
//清除16×8字符快,len为要清除的字符块的长度
//x坐标寄存器(字节),y坐标寄存器(点行)
{
WORD temp;
BYTE hi, lo;
BYTE a, b;
temp = y * AP;
hi = HIBYTE (temp);
lo = LOBYTE (temp);
lo = x + lo;
if (CY == 1) {hi += 0x01; CY = 0;}
for (b = 0; b
{
WLCDCOM (CSRDOWN);
WLCDCOM (CSRW);
WLCDDATA (lo);
WLCDDATA (hi);
WLCDCOM (MWRITE);
for (a = 0; a < 16; a++)
{
WLCDDATA (0x00);
}
lo = lo + 0x01;
if (CY == 1) {hi += 0x01; CY = 0;}
}
}

void WLCDCHR (BYTE x, BYTE y, BYTE (*p) [32], BYTE num )
//功能:显示16×32字符,num为要显示字符数组的第一维的值
//x坐标寄存器(字节),y坐标寄存器(点行)
{
WORD temp;
BYTE hi, lo;
BYTE a, b, c;
temp = y * AP;
hi = HIBYTE (temp);
lo = LOBYTE (temp);
lo = x + lo;
if (CY == 1) {hi += 0x01; CY = 0;}
WLCDCOM (CSRDOWN);
for (a = 0; a
{
WLCDCOM (CSRW);
WLCDDATA (lo);
WLCDDATA (hi);
WLCDCOM (MWRITE);
for (c = 0; c < 0x20; c += 2)
{
WLCDDATA (* (* (p + a) + c) );
}
lo = lo + 0x01;
if (CY == 1) {hi += 0x01; CY = 0;}
WLCDCOM (CSRW);
WLCDDATA (lo);
WLCDDATA (hi);
WLCDCOM (MWRITE);
for (c = 1; c < 0x20; c += 2)
{
WLCDDATA (* (* (p + a) + c) );
}
lo = lo + 0x01;
if (CY == 1) {hi += 0x01; CY = 0;}
}
}
void INITLCD (void)
//初始化LCD显示参数以及界面
{
WORD a, b, c;
WLCDCOM (SYSSET);
for (b = 0; b < 8; b++)
{
WLCDDATA (SYSTAB[b]);
}
WLCDCOM (SCROLL);
for (b = 0; b < 10; b++)
{
WLCDDATA (SCRTAB[b]);
}
WLCDCOM (HDOTSCR);
WLCDDATA (0X00);
WLCDCOM (OVLAY);
WLCDDATA (0X1c);
WLCDCOM (DISPOFF);
WLCDDATA (0X56);
CLRVRAM();
WLCDCOM (CSRFORM);
WLCDDATA (0X07);
WLCDDATA (0X8f);
WLCDCOM (DISPON);
WLCDDATA (0X16);
}
/*DELAY SUBROUTINES*/
void DELAYX1MS (WORD count)
//延时count毫秒
{
BYTE i, j;
for (i = 0; i for (j = 0; j < 120; j++)
;
}

void CLRFG (void) //清除标志位
{
FG_FIRST = 0;
FG_MAIN = 0;
FG_PRG = 0;
FG_PRG1 = 0;
FG_PRG2 = 0;
FG_PRG3 = 0;
FG_CYCLE = 0;
FG_LIMIT = 0;
FG_TIME = 0;
FG_INPUT = 0;
FG_OUTPUT = 0;
FG_PID = 0;
FG_SELFCTL = 0;
FG_VARY = 0;
}
/*
void FLASH()
{
FILLBLOCK(7,0,2);
DELAYX1MS(15);
CLRBLOCK(7,0,2);
DELAYX1MS(8);
WNUMBER(7,0,C_NUM,1);
WNUMBER(8,0,C_NUM,2);
DELAYX1MS(15);
}
*/
void DISPPWD (void)
{
// CLRFG();
CLRSCREEN();
WLCDCHR (2, 64, C_PASSWORD, 5);
WBLOCK (12, 64, C_COLON, 1);
FG_PWD = 1;
}
void DISPPRG (void) //编程的第一界面
{
CLRFG();
CLRSCREEN();
WLCDCHR (0, 0, C_ROUT, 2);
WBLOCK (4, 0, C_COLON, 1);
WLCDCHR (1, 144, C_PROG, 2);
WLCDCHR (9, 144, C_CANCEL, 2);
WLCDCHR (17, 144, C_ENTER, 2);
WLCDCHR (25, 144, C_MAIN, 2);
FG_PRG = 1;
}

void DISPCYCLE (void)
{
CLRFG();
CLRSCREEN();
WLCDCHR (0, 16, C_CYCLE, 2);
WLCDCHR (4, 16, C_STSEG, 2);
WLCDCHR (10, 16, C_CYCLE, 2);
WLCDCHR (14, 16, C_ENDSEG, 2);
WLCDCHR (20, 16, C_CYCLE, 2);
WLCDCHR (24, 16, C_TIMES, 2);

WLCDCHR (9, 144, C_CANCEL, 2);
WLCDCHR (17, 144, C_ENTER, 2);
WLCDCHR (25, 144, C_MAIN, 2);
FG_CYCLE = 1;
}

main()
{
BYTE i;
INITLCD();
CLRSCREEN();
WNUMBER (6, 32, C_LETTER, 3);
}
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息