📄 term.c
字号:
/*======================================================
condition:
Controller Board: AMC-5S111 1.0
LCD Controller: SED1335
MCU Mode: arm2119
compiler: keil arm
LCM MODEL: AM320240T-57B68
Designer:Prinse
========================================================
I/O configure:
DataBus------------P1.16~p1.23
A0-----------------P1.25
RD-----------------P1.24
WR-----------------P0.28
LCDCS--------------P0.29
LCDRST-------------P0.30
====================================================*/
#include "Config.h"
#include "math.h"
#include "Ascii8x16.h"
//#include "LittleHZ.h"
#include "hzzk.h"
#define system_set 0x40
#define sleep_in 0x53
#define disp_on 0x59
#define disp_off 0x58
#define scroll 0x44
#define scrform 0x5d
#define cgram_adr 0x5c
#define csrdir_right 0x4c
#define csrdir_left 0x4d
#define csrdir_up 0x4e
#define csrdir_down 0x4f
#define hdot_scr 0x5a
#define ovlay 0x5b
#define csrw 0x46
#define csrr 0x47
#define mwrite 0x42
#define mread 0x43
#define A0 0x02000000
//sbit A0=P3^3;
#define LCDCS 0x20000000
//sbit LCDCS=P1^4;
#define LCDRST 0x40000000
//sbit LCDRST=P1^5;
#define RD 0x01000000
#define WR 0x10000000
#define P1PORT 0x00ff0000
#define ADCINT 0x00010000
#define LP 0x00100000
#define LED1CON (1<<22)
#define X9313INC (1<<11)
#define X9313UD (1<<10)
#define TRUE 1
#define FAULT 0
typedef struct UartMode
{
uint8 datab;
uint8 stopb;
uint8 parity;
} UARTMODE;
#define Rx_Leng 2048
uint8 Rx_Buff[1024];
uint8 Rx=0,Rd=0;
struct {
unsigned char Xbyte[40];
}Row[240];
uint16 buffadd=0; //SRAM缓冲区指针
unsigned char data_len=0; //命令参数个数
//bit cursor_status=0; //光标状态:1,显示;0,不显示。
unsigned sleep=0;
unsigned char disp_mode=0; //显示模式;0:240行,无自动换行。1:字符自动换行模式。
unsigned char bit_offset=0;
unsigned char H_font=0; //字体模式:高度放大标志
unsigned char W_font=0; //字体模式:宽度放大
//bit first=0; //复位后未接收数据标志
//bit oky=0; //数据接收完毕标志
//注意:编译器中,汉字字符串读取先低位,后高位。
unsigned char hz_code[2]; //汉字内码缓存
unsigned char hzmatrix[32]; //汉字点阵数据缓存
unsigned char ascii[16]; //ASCII码点阵数据缓存
unsigned char csradd[2]={0,0}; //sed1335光标地址
unsigned int X=0,Y=0; //字符自动换行模式下坐标。
unsigned char system_set_ini[8]={0x34,0x87,0x00,0x27,0x48,0xf0,0x28,0x00};
unsigned char scroll_ini[9]={0x00,0x00,0xf0,0x80,0x25,0xf0,0x00,0x4b,0xf0};
unsigned char scrform_ini[2]={0x07,0x86};
unsigned char hdot_scr_ini[2]={0x00,0x0b};
unsigned char ovlay_ini[1]={0x0e};//{0x0d};
unsigned char disp_on_ini[1]={0x14};//{0x24}; //正常模式,底层2HZ闪烁。
unsigned char disp_on_bg[1]={0x14}; //正常模式,第一层无闪烁。第二层关闭。
unsigned char disp_off_ini[1]={0x00};
unsigned char cur_set_ini1[2]={0x00,0x00};
unsigned char cur_set_ini2[2]={0x80,0x25};
unsigned char cur_set_ini3[2]={0x00,0x4b};
unsigned char null[]={0x00};
void draw_table()
{
;
}
void Delay(uint8 dly)
{
uint8 i;
for(i=0;i<dly;i++);
}
void DelayNS(uint32 dly)
{
uint32 i;
for(;dly>0;dly--)
for(i=0;i<50000;i++);
}
void DelayUS(int t)
{
int i;
for(i=0;i<t;i++);
}
void adj_gray(uint8 adj)
{
switch(adj)
{
case 0:
{
IO0CLR=X9313UD;
IO0SET=X9313INC;
Delay(3);
IO0CLR=X9313INC;
Delay(3);
IO0SET=X9313INC;
}
break;
case 1:
{
IO0SET=X9313UD;
IO0SET=X9313INC;
Delay(3);
IO0CLR=X9313INC;
Delay(3);
IO0SET=X9313INC;
}
break;
default:
break;
}
}
uint8 UART0_Ini(uint32 baud,UARTMODE set)
{
uint32 bak;
if((0==baud)||(baud>115200)) return(0);
if((set.datab<5)||(set.datab>8)) return(0);
if((0==set.stopb)||(set.stopb>2)) return(0);
if(set.parity>4) return(0);
U0LCR=0x80;
bak=(Fpclk>>4)/baud;
U0DLM=bak>>8;
U0DLL=bak&0xff;
bak=set.datab-5;
if(2==set.stopb)bak|=0x04;
if(0!=set.parity)
{
set.parity=set.parity-1;
bak|=0x08;
}
bak|=set.parity<<4;
U0LCR=bak;
U0FCR=0x01;
U0IER=0x01;
return(1);
}
uint8 UART1_Ini(uint32 baud,UARTMODE set)
{
uint32 bak;
if((0==baud)||(baud>115200)) return(0);
if((set.datab<5)||(set.datab>8)) return(0);
if((0==set.stopb)||(set.stopb>2)) return(0);
if(set.parity>4) return(0);
U1LCR=0x80;
bak=(Fpclk>>4)/baud;
U1DLM=bak>>8;
U1DLL=bak&0xff;
bak=set.datab-5;
if(2==set.stopb)bak|=0x04;
if(0!=set.parity)
{
set.parity=set.parity-1;
bak|=0x08;
}
bak|=set.parity<<4;
U1LCR=bak;
U1FCR=0x01;
U1IER=0x01;
return(1);
}
void en_lcd()
{
IO0CLR=LCDCS;
// DelayUS(10);
}
void off_lcd(void)
{
IO0SET=LCDCS;
//DelayUS(10);
}
//写入一个字节
void write_byte(unsigned char dta)
{
uint32 tmp;
tmp=dta<<16;
IO1SET=RD;
IO1CLR=P1PORT;
IO1SET=tmp;
IO0CLR=WR;
IO0SET=WR;
}
//SED1335命令写函数
void sed1335_write(unsigned char commandcode, unsigned char *parameter,unsigned char n)
{
unsigned char i=0;
en_lcd();
IO1SET=A0;
write_byte(commandcode);
for(i=0;i<n;i++)
{
IO1CLR=A0;
write_byte(parameter[i]);
}
}
//sed1335读函数,可以读取光标,显示数据
void sed1335_read(char commandcode, unsigned char *parameter,unsigned int n)
{
int i=0;
uint32 tmp;
en_lcd();
tmp=commandcode<<16;
IO1SET=A0;
IO1SET=RD;
IO1CLR=P1PORT;
IO1SET=tmp;
IO0CLR=WR;
IO0SET=WR;
IO1DIR=A0|RD;
for(i=0;i<n;i++)
{
IO1CLR=A0;
IO0SET=WR;
IO1CLR=RD;
IO1SET=RD;
tmp=IO1PIN;
parameter[i]=tmp>>16;
}
IO1DIR=P1PORT|A0|RD;
}
//============================================================================
//光标地址写入sed1335寄存器并进行校验
//============================================================================
void cursor_write()
{
//unsigned char csr_ver[2];
sed1335_write(csrw,csradd,2);
/*
sed1335_read(csrr,csr_ver,2);
//对于写入的光标地址校验
while((csr_ver[0]!=csradd[0])||(csr_ver[1]!=csradd[1])){
sed1335_write(csrw,csradd,2);
sed1335_read(csrr,csr_ver,2);
}
*/
return;
}
//
void set_xy(unsigned int x, unsigned int y)
{
//unsigned int cursor_addr;
if(disp_mode==0){ //点阵坐标定位
if(x>319) x=319;
if(y>239) y=239;
X=x;Y=y;
// bit_offset=x%8; //相对字节单位的移位
// cursor_addr=y*40+(x/8); //计算光标地址
// csradd[0]=(unsigned char)cursor_addr;
// csradd[1]=(unsigned char)(cursor_addr>>8);
// cursor_write();
}
if(disp_mode==1){
bit_offset=0;
if(X>39) X=39; //根据字体限定设定字符坐标范围。
if(Y>14-H_font) Y=14-H_font;
X=x; Y=y;
// cursor_addr=y;
// cursor_addr=cursor_addr*40*16+x; //计算光标地址
// csradd[0]=(unsigned char)cursor_addr;
// csradd[1]=(unsigned char)(cursor_addr>>8);
// cursor_write();
}
return;
}
//写点函数
void write_dot(int x, int y)
{
unsigned int xx;
unsigned char xoffset;
if(y>240||x>320) return;
xx=x/8;
xoffset=x%8;
Row[y].Xbyte[xx]=(Row[y].Xbyte[xx])|(0x80>>xoffset);
}
//画线函数
void vertical_line(int x1,int yy1,int x2,int y2)
{
while(yy1!=y2){
write_dot(x1,yy1);
if(yy1<y2) ++yy1;
else if(yy1>y2) --yy1;
}
}
void horizontal_line(int x1, int yy1,int x2,int y2)
{
while(x1!=x2){
write_dot(x1,yy1);
if(x1<x2) ++x1;
else if(x1>x2) --x1;
}
}
void draw_line(int x1,int yy1,int x2,int y2)
{
float k=0;
short b=0;
if(x1==x2) vertical_line(x1,yy1,x2,y2);
else if(yy1==y2) horizontal_line(x1,yy1,x2,y2);
else {
k=(y2-yy1)/(x2-x1);
b=yy1-k*x1;
if(k<1 && k>-1){
while(x1!=x2){
write_dot(x1,yy1);
if(x1>x2) --x1;
else if(x1<x2) ++x1;
yy1=k*x1+b;
}
}
else {
while(yy1!=y2){
write_dot(x1,yy1);
if(yy1>y2) --yy1;
else if(yy1<y2) ++yy1;
x1=(yy1-b)/k;
}
}
}
return;
}
void draw_circle(int a,int b,int R)
{
int xdot,ydot;
float tmp,i=0;
while(i<3.15/2){
tmp=R*sin(i); if(tmp-(int)tmp>0.7) ++tmp;
ydot=(int)tmp;
tmp=R*cos(i); if(tmp-(int)tmp>0.7) ++tmp;
xdot=(int)tmp;
write_dot(a+xdot,b+ydot);
if(b-ydot>0) write_dot(a+xdot,b-ydot);
if(a-xdot>0) write_dot(a-xdot,b+ydot);
if(a-xdot>0 && b-ydot>0) write_dot(a-xdot,b-ydot);
i+=1.57/(1+R*2);
}
}
//开关光标
void cursor_disp(unsigned char onoff)
{
uint16 addr;
unsigned char hl[2]={0x80,0x25};
uint16 i=0;
addr=csradd[1];
addr=addr<<8;
addr+=csradd[0];
addr+=0x2580;
hl[0]=(unsigned char)addr;
hl[1]=(unsigned char)(addr>>8);
en_lcd();
sed1335_write(csrdir_down,null,1);
sed1335_write(csrw, hl,2);
IO1SET=A0;
write_byte(mwrite);
IO1CLR=A0;
if(onoff==1)
{
for(i=0;i<16;i++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -