📄 ra8803.c
字号:
/***********************************************************************/
/* */
/* FILE :RA8803.c */
/* DATE :Sat, Dec 03, 2005 */
/* DESCRIPTION :Main Program */
/* CPU TYPE :H8/36014F */
/* */
/* This file is generated by Hitachi Project Generator (Ver.2.1). */
/* */
/***********************************************************************/
#include "iodefine.h"
#include <machine.h>
#include "RA8803.h"
#include "tupian.h"
//#include "zimochar.h" //字符 符号等字库 8*8 8*16 12*12 16*16 点阵
//#include "hanzi12x12.h" //12*12点阵汉字字库
//#include "hanzi16x16.h" //16*16点阵汉字字库
#ifdef __cplusplus
extern "C" {
#endif
void abort(void);
#ifdef __cplusplus
}
#endif
void main(void)
{
nop();
nop();
main_1:
ini_ram(); //RAM初始化,主要写入0外的数据
ini_pp(); //端口及外围功能初始化
buzzeron();
lcm_CE=0;
lcm_RW=1;
lcm_E=0;
lcm_RST=1;
lcm_CD=0;
ini_lcm();
for(;;)
{
// emi_p();
RESET_WATCHDOG(); /* kicks the dog */
//不对LCM操作时,主流程定时置这些口的状态,以免出错
//显示处理
display();
}
}
void abort(void)
{
}
//-----------------------------------------------------
//清RAM
//-----------------------------------------------------
void ini_ram(void)
{
gflg1=0;
}
//-----------------------------------------------------
//外围功能初始化
//端口 0---input 1:output
// 7 6 5 4 3 2 1 0
//P1 1 1 1 1 / 1 1 1
//P2 / / / / / 1 1 1
//P5 1 1 1 1 1 1 1 1
//P7 / 1 1 1 1 1 1 0
//P8 / / / 0 1 1 1 1
//PB / / / / 0 0 0 0
//TV: 暂不用
//TW: 定时
//外中断: 无
//-----------------------------------------------------
void ini_pp(void)
{
portmr1 =0x00; //0b00001010; //TXD TXD2
PORT1 =0x37; //0b00110111;
portcr1 =0xcf; //0b11001111; //方向
portur1=0x20; //0b00000000;
PORT2 =0x06; //0b00000110;
portcr2 =0xff; //0b11111111; //方向
portmr5 =0x00; //0b00000000; //为普通IO
PORT5 =0x00; //0b00000000;
portcr5 =0xff; //0b11111111; //方向
portur5=0x00; //0b00000000;
PORT7 =0x57; //0b01010111;
portcr7 =0xfe; //0b11111110; //方向
PORT8 =0x1b; //0b00011011;
portcr8 =0x0f; //0b00001111; //方向
/*
//TIMERV初始化
//输出2.5K频率 驱动蜂鸣器
TV.TCNTV=0;
TV.TCRV0.BYTE=0x0b; //0b00001011; //与A匹配 计数器清0 输入脉冲为1/64振荡频率
TV.TCORA=50; //2.5K比较常数
TV.TCORB=25; //在50%时与B比较匹配, 则获得了50%占空比
*/
//TIMERW初始化
//定时20毫秒,定时计时
TW.GRA=0xffff;
TW.GRB=0xffff;
TW.GRC=0xffff;
TW.GRD=0xffff;
TW.TCNT=25536; //20毫秒 //25536; //20毫秒
TW.TIOR0.BYTE=0x88; //0b10001000;
TW.TIOR1.BYTE=0x88; //0b10001000;
TW.TMRW.BYTE=0xc8; //0b11001000;
TW.TCRW.BYTE=0xa0; //0b10100000; 4倍分频
TW.TSRW.BYTE=0x70; //0b01110000
TW.TIERW.BYTE=0xf0; //0b11110000;
TW.TMRW.BIT.CTS=1; //START
/*
//ADC初始化
AD.ADCSR.BYTE=0x12; //00010010 SCAN模式 AN0~AN2通道
AD.ADCR.BYTE =0x00; //00000000
AD.ADCSR.BIT.ADST=1; //启动ADC
//SCI--1 初始化
//9600BPS 1个起始 1个停止 无校验
SCI3.SCR3.BYTE=0x00;
SCI3.SMR.BYTE=0x00; //00000000 1 开始 1结束 8数据 内部1:1 无校验
SCI3.BRR=51; //9600BPS
delayus(120);
SCI3.SSR.BYTE=(SCI3.SSR.BYTE|0x80)&0x80;
SCI3.SCR3.BYTE=0x50; //接收允许 发送禁止 接收中断允许 发送中断禁止
//SCI--2 初始化
//9600BPS 1个起始 1个停止 无校验
SCI3_2.SCR3.BYTE=0x00;
SCI3_2.SMR.BYTE=0x00; //00000000 1 开始 1结束 8数据 内部1:1 无校验
SCI3_2.BRR=51; //9600BPS
delayus(120);
SCI3_2.SSR.BYTE=(SCI3_2.SSR.BYTE|0x80)&0x80;
SCI3_2.SCR3.BYTE=0x50; //接收允许 发送禁止 接收中断允许 发送中断禁止
//WDT初始化
//WDT时间为120毫秒
WDT.TMWD.BYTE =0x0e; //0b00001110; //时间常数
WDT.TCSRWD.BIT.B4WI=0;
WDT.TCSRWD.BIT.TCSRWE=1;
WDT.TCSRWD.BIT.WDON=1; //WDT开启
WDT.TCSRWD.BIT.TCSRWE=0;
WDT.TCSRWD.BIT.B4WI=0;
*/
//中断初始化
set_imask_ccr(0);
}
//--------------------------------------------------------
//画园函数--LCM用
//画法:按照行进行处理, 从行数=(坐标原点纵坐标-半径) 时开始计算, 在坐标原点横坐标点画出第1点
// 此后需要每行计算两个点的坐标,纵坐标相同,就是行数,横坐标以原点对称
// 横坐标计算方法: 设原点坐标为(x0,y0) 新点坐标为(x,y), y就是当前正在计算的行数 r为半径
// x=x0-sqrt(r*r-(y0-y)*(y0-y)) sqrt:开平方
// 计算持续到(原点纵坐标+半径)为止
//输入:圆心(X,Y)是以左上角为原点(0,0)的坐标 半径 都是以显示点为单位
//输出:无
//--------------------------------------------------------
#define LCD_SEG 320 //点列数
#define LCD_COM 240 //点行数
#define START_RAM 0x0000 //LCM上显示RAM起始地址
union
{
unsigned int W;
struct
{
unsigned char H;
unsigned char L;
}HL;
}LCM_ADDU;
#define lcd_ram_add LCM_ADDU.W
#define lcd_ram_add_l LCM_ADDU.HL.L
#define lcd_ram_add_h LCM_ADDU.HL.H
void draw_circle(uint x0,uint y0,uint r)
{
uint x,y,ls1,ls3;
ulong ls2;
uchar ls4;
if(r<=1)
{ //半径<=1, 则在原点处画一个点
//下面读出屏幕上对应数据, 处理后写回
lcd_ram_add=x0/8;
lcd_ram_add+=START_RAM+y0*(LCD_SEG/8); //获取对应点RAM地址
ls4=crd_lcm_ram(lcd_ram_add_h,lcd_ram_add_l);
ls4|=(0x80>>(x0%8));
cwr_lcm_ram(lcd_ram_add_h,lcd_ram_add_l,ls4);
return;
}
if (y0<r) ls1=0;
else ls1=y0-r; //确定起始行
for (y=ls1;y<LCD_COM;y++) //y:处理的开始行, 也是园上各点的纵坐标
{
if (y<y0) ls2=(ulong)r*(ulong)r-(ulong)(y0-y)*(ulong)(y0-y);
else ls2=(ulong)r*(ulong)r-(ulong)(y-y0)*(ulong)(y-y0);
ls2=sqrtl(ls2);
ls3=(uint)ls2; //计算出园上点离坐标原点的横向距离
if (x0<ls3) //下面获取第1点的横坐标(圆心左边的点)
{//点在显示区域外,不做处理
}
else
{//点在显示区域内
x=x0-ls3; //获得x坐标,y坐标就是当前的y
//下面读出屏幕上对应数据, 处理后写回
lcd_ram_add=x/8;
lcd_ram_add+=START_RAM+y*(LCD_SEG/8); //获取对应点RAM地址
ls4=crd_lcm_ram(lcd_ram_add_h,lcd_ram_add_l);
ls4|=(0x80>>(x%8));
cwr_lcm_ram(lcd_ram_add_h,lcd_ram_add_l,ls4);
}
if ((x0+ls3)>LCD_SEG) //下面获取第2点的横坐标(圆心右边的点)
{//点在显示区域外,不做处理
}
else
{//点在显示区域内
x=x0+ls3; //获得x坐标,y坐标就是当前的y
//下面读出屏幕上对应数据, 处理后写回
lcd_ram_add=x/8;
lcd_ram_add+=START_RAM+y*(LCD_SEG/8); //获取对应点RAM地址
ls4=crd_lcm_ram(lcd_ram_add_h,lcd_ram_add_l);
ls4|=(0x80>>(x%8));
cwr_lcm_ram(lcd_ram_add_h,lcd_ram_add_l,ls4);
}
if (y>=(y0+r)) return; //当前行已经超过园所及的地方, 画园完成, 返回
}
}
//--------------------------------------------------------
//向LCM RAM写入一字节数据函数
//输入:RAM地址高字节 RAM地址低字节 数据
//输出:无
//--------------------------------------------------------
void cwr_lcm_ram(unsigned char h,unsigned char l,unsigned char ls4)
{
main_lsl=l;
main_lsh=h;
main_ls/=40;
LCD_CmdWrite(0x70,main_lsl); // 設定游標垂直位址(Common)----------光标地址--Y--
main_lsl=l;
main_lsh=h;
main_ls%=40;
LCD_CmdWrite(0x60,main_lsl); // 設定游標水平位址(Segment)----------光标地址--X--
wr_lcm_data(ls4);
}
//--------------------------------------------------------
//从LCM RAM读出一字节数据函数
//输入:RAM地址高字节 RAM地址低字节
//输出:无
//--------------------------------------------------------
unsigned char crd_lcm_ram(unsigned char h,unsigned char l)
{
uchar ls1;
main_lsl=l;
main_lsh=h;
main_ls/=40;
LCD_CmdWrite(0x70,main_lsl); // 設定游標垂直位址(Common)----------光标地址--Y--
main_lsl=l;
main_lsh=h;
main_ls%=40;
LCD_CmdWrite(0x60,main_lsl); // 設定游標水平位址(Segment)----------光标地址--X--
ls1=rd_lcm_data();
return ls1;
}
//--------------------------------------------------------
//长整型定点数开平方函数,结果为整型
//输入:长整型被开平方数
//输出:整型平方根
//说明:本函数最大在某些大于32767*32676即1073676289的开平方的时候会不正确
//--------------------------------------------------------
unsigned int sqrtl(unsigned long M)
{
unsigned int N, i;
unsigned long tmp, ttp; // 结果、循环计数
if (M == 0) // 被开方数,开方结果也为0
return 0;
N = 0;
tmp = (M >> 30); // 获取最高位:B[m-1]
M <<= 2;
if (tmp > 1) // 最高位为1
{
N ++; // 结果当前位为1,否则为默认的0
tmp -= N;
}
for (i=15; i>0; i--) // 求剩余的15位
{
N <<= 1; // 左移一位
tmp <<= 2;
tmp += (M >> 30); // 假设
ttp = N;
ttp = (ttp<<1)+1;
M <<= 2;
if (tmp >= ttp) // 假设成立
{
tmp -= ttp;
N ++;
}
}
return N;
}
//------------------------------------------------------------------
//简单显示程序,显示图片
//按照现在的初始化, 第1区240行, 地址从0x0000开始, 第2区240行, 地址从0x3000开始,
// 则图形应从0x3000开始,为什么?还没明白,以后研究
#define DIS_DLT 5
#define DIS_DLT1 2
//------------------------------------------------------------------
void display(void)
{
uchar i,j;
uint m;
switch (disp_pro_flg)
{
case 1: //送出竖条纹
if (disp_dlt_ct>=DIS_DLT1)
{
// LCD_CmdWrite(0x12,0x92); // LCD 顯示圖層設定
LCD_CmdWrite(0x60,0x00); // 設定游標水平位址(Common)----------光标地址--Y--
LCD_CmdWrite(0x70,0x00); // 設定游標垂直位址(Segment)----------光标地址--X--
for (m=0;m<40*240;m++)
{
wr_lcm_data(0x0f);
}
disp_pro_flg++;
disp_dlt_ct=0;
buzzeron();
}
break;
case 2: //
disp_pro_flg++;
disp_dlt_ct=0;
break;
case 3: //送出方块
if (disp_dlt_ct>=DIS_DLT1)
{
// LCD_CmdWrite(0x12,0xa1); // LCD 顯示圖層設定
LCD_CmdWrite(0x60,0x00); // 設定游標水平位址(Common)----------光标地址--Y--
LCD_CmdWrite(0x70,0x00); // 設定游標垂直位址(Segment)----------光标地址--X--
for (i=0;i<30;i++)
{
for (j=0;j<40*4;j++)
{
wr_lcm_data(0x0f);
}
for (j=0;j<40*4;j++)
{
wr_lcm_data(0xf0);
}
}
disp_pro_flg++;
disp_dlt_ct=0;
// buzzeron();
}
break;
case 4: //
if (disp_dlt_ct>=DIS_DLT1)
{
//送出新图片
// LCD_CmdWrite(0x12,0x92); // LCD 顯示圖層設定
LCD_CmdWrite(0x60,0x00); // 設定游標水平位址(Common)----------光标地址--Y--
LCD_CmdWrite(0x70,0x00); // 設定游標垂直位址(Segment)----------光标地址--X--
for (m=0;m<40*240;m++)
{
wr_lcm_data(tupian1[m]);
}
disp_pro_flg++;
disp_dlt_ct=0;
// buzzeron();
}
break;
case 5: //送出图片5
if (disp_dlt_ct>=DIS_DLT1)
{
//送出新图片
// LCD_CmdWrite(0x12,0x92); // LCD 顯示圖層設定
LCD_CmdWrite(0x60,0x00); // 設定游標水平位址(Common)----------光标地址--Y--
LCD_CmdWrite(0x70,0x00); // 設定游標垂直位址(Segment)----------光标地址--X--
for (m=0;m<40*240;m++)
{
wr_lcm_data(tupian5[m]);
}
disp_pro_flg++;
disp_dlt_ct=0;
// buzzeron();
}
break;
case 6: //
disp_pro_flg++;
disp_dlt_ct=0;
break;
case 7: //送出图片2
if (disp_dlt_ct>=DIS_DLT)
{
//送出新图片
// LCD_CmdWrite(0x12,0xa1); // LCD 顯示圖層設定
LCD_CmdWrite(0x60,0x00); // 設定游標水平位址(Common)----------光标地址--Y--
LCD_CmdWrite(0x70,0x00); // 設定游標垂直位址(Segment)----------光标地址--X--
for (m=0;m<40*240;m++)
{
wr_lcm_data(tupian2[m]);
}
disp_pro_flg++;
disp_dlt_ct=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -