📄 mwclock.c
字号:
/********************************************************************
** Microwindows 时间显示演示程序 cnmusic@163.net 2006.2.26 **********
*********************************************************************
** 利用S3C44B0X 的RTC功能提供时间的显示 **
** 还提供了设置时间的界面。 **
*********************************************************************/
#define MWINCLUDECOLORS
#include <stdio.h>
#include <strings.h>
#include "nano-X.h"
// 寄存器定义
#define MCLK 64000000
#define WRBUFOPT (0x8) //write_buf_on
#define SYSCFG_0KB (0x0|WRBUFOPT)
#define SYSCFG_4KB (0x2|WRBUFOPT)
#define SYSCFG_8KB (0x6|WRBUFOPT)
#define DRAM 1 //In case DRAM is used
#define SDRAM 2 //In case SDRAM is used
#define BDRAMTYPE SDRAM //used in power.c,44blib.c
//BUSWIDTH; 16,32
#define BUSWIDTH (16)
#define CACHECFG SYSCFG_8KB
#define _RAM_STARTADDRESS 0xc000000
//#define _ISR_STARTADDRESS 0xc1fff00 //GCS6:16M DRAM
#define _ISR_STARTADDRESS 0xc7fff00 //GCS6:64M DRAM/SDRAM
//this code is in Feng's board
#define Non_Cache_Start (0x2000000)
#define Non_Cache_End (0xc000000)
/* System */
#define rSYSCFG (*(volatile unsigned *)0x1c00000)
/* Cache */
#define rNCACHBE0 (*(volatile unsigned *)0x1c00004)
#define rNCACHBE1 (*(volatile unsigned *)0x1c00008)
/* Bus control */
#define rSBUSCON (*(volatile unsigned *)0x1c40000)
/* Memory control */
#define rBWSCON (*(volatile unsigned *)0x1c80000)
#define rBANKCON0 (*(volatile unsigned *)0x1c80004)
#define rBANKCON1 (*(volatile unsigned *)0x1c80008)
#define rBANKCON2 (*(volatile unsigned *)0x1c8000c)
#define rBANKCON3 (*(volatile unsigned *)0x1c80010)
#define rBANKCON4 (*(volatile unsigned *)0x1c80014)
#define rBANKCON5 (*(volatile unsigned *)0x1c80018)
#define rBANKCON6 (*(volatile unsigned *)0x1c8001c)
#define rBANKCON7 (*(volatile unsigned *)0x1c80020)
#define rREFRESH (*(volatile unsigned *)0x1c80024)
#define rBANKSIZE (*(volatile unsigned *)0x1c80028)
#define rMRSRB6 (*(volatile unsigned *)0x1c8002c)
#define rMRSRB7 (*(volatile unsigned *)0x1c80030)
/* UART */
#define rULCON0 (*(volatile unsigned *)0x1d00000)
#define rULCON1 (*(volatile unsigned *)0x1d04000)
#define rUCON0 (*(volatile unsigned *)0x1d00004)
#define rUCON1 (*(volatile unsigned *)0x1d04004)
#define rUFCON0 (*(volatile unsigned *)0x1d00008)
#define rUFCON1 (*(volatile unsigned *)0x1d04008)
#define rUMCON0 (*(volatile unsigned *)0x1d0000c)
#define rUMCON1 (*(volatile unsigned *)0x1d0400c)
#define rUTRSTAT0 (*(volatile unsigned *)0x1d00010)
#define rUTRSTAT1 (*(volatile unsigned *)0x1d04010)
#define rUERSTAT0 (*(volatile unsigned *)0x1d00014)
#define rUERSTAT1 (*(volatile unsigned *)0x1d04014)
#define rUFSTAT0 (*(volatile unsigned *)0x1d00018)
#define rUFSTAT1 (*(volatile unsigned *)0x1d04018)
#define rUMSTAT0 (*(volatile unsigned *)0x1d0001c)
#define rUMSTAT1 (*(volatile unsigned *)0x1d0401c)
#define rUBRDIV0 (*(volatile unsigned *)0x1d00028)
#define rUBRDIV1 (*(volatile unsigned *)0x1d04028)
#ifdef __BIG_ENDIAN
#define rUTXH0 (*(volatile unsigned char *)0x1d00023)
#define rUTXH1 (*(volatile unsigned char *)0x1d04023)
#define rURXH0 (*(volatile unsigned char *)0x1d00027)
#define rURXH1 (*(volatile unsigned char *)0x1d04027)
#define WrUTXH0(ch) (*(volatile unsigned char *)(0x1d00023))=(unsigned char)(ch)
#define WrUTXH1(ch) (*(volatile unsigned char *)(0x1d04023))=(unsigned char)(ch)
#define RdURXH0() (*(volatile unsigned char *)(0x1d00027))
#define RdURXH1() (*(volatile unsigned char *)(0x1d04027))
#define UTXH0 (0x1d00020+3) //byte_access address by BDMA
#define UTXH1 (0x1d04020+3)
#define URXH0 (0x1d00024+3)
#define URXH1 (0x1d04024+3)
#else //Little Endian
#define rUTXH0 (*(volatile unsigned char *)0x1d00020)
#define rUTXH1 (*(volatile unsigned char *)0x1d04020)
#define rURXH0 (*(volatile unsigned char *)0x1d00024)
#define rURXH1 (*(volatile unsigned char *)0x1d04024)
#define WrUTXH0(ch) (*(volatile unsigned char *)0x1d00020)=(unsigned char)(ch)
#define WrUTXH1(ch) (*(volatile unsigned char *)0x1d04020)=(unsigned char)(ch)
#define RdURXH0() (*(volatile unsigned char *)0x1d00024)
#define RdURXH1() (*(volatile unsigned char *)0x1d04024)
#define UTXH0 (0x1d00020) //byte_access address by BDMA
#define UTXH1 (0x1d04020)
#define URXH0 (0x1d00024)
#define URXH1 (0x1d04024)
#endif
/* SIO */
#define rSIOCON (*(volatile unsigned *)0x1d14000)
#define rSIODAT (*(volatile unsigned *)0x1d14004)
#define rSBRDR (*(volatile unsigned *)0x1d14008)
#define rIVTCNT (*(volatile unsigned *)0x1d1400c)
#define rDCNTZ (*(volatile unsigned *)0x1d14010)
/* IIS */
#define rIISCON (*(volatile unsigned *)0x1d18000)
#define rIISMOD (*(volatile unsigned *)0x1d18004)
#define rIISPSR (*(volatile unsigned *)0x1d18008)
#define rIISFCON (*(volatile unsigned *)0x1d1800c)
#ifdef __BIG_ENDIAN
#define rIISFIF ((volatile unsigned short *)0x1d18012)
#else //Little Endian
#define rIISFIF ((volatile unsigned short *)0x1d18010)
#endif
/* I/O PORT */
#define rPCONA (*(volatile unsigned *)0x1d20000)
#define rPDATA (*(volatile unsigned *)0x1d20004)
#define rPCONB (*(volatile unsigned *)0x1d20008)
#define rPDATB (*(volatile unsigned *)0x1d2000c)
#define rPCONC (*(volatile unsigned *)0x1d20010)
#define rPDATC (*(volatile unsigned *)0x1d20014)
#define rPUPC (*(volatile unsigned *)0x1d20018)
#define rPCOND (*(volatile unsigned *)0x1d2001c)
#define rPDATD (*(volatile unsigned *)0x1d20020)
#define rPUPD (*(volatile unsigned *)0x1d20024)
#define rPCONE (*(volatile unsigned *)0x1d20028)
#define rPDATE (*(volatile unsigned *)0x1d2002c)
#define rPUPE (*(volatile unsigned *)0x1d20030)
#define rPCONF (*(volatile unsigned *)0x1d20034)
#define rPDATF (*(volatile unsigned *)0x1d20038)
#define rPUPF (*(volatile unsigned *)0x1d2003c)
#define rPCONG (*(volatile unsigned *)0x1d20040)
#define rPDATG (*(volatile unsigned *)0x1d20044)
#define rPUPG (*(volatile unsigned *)0x1d20048)
#define rSPUCR (*(volatile unsigned *)0x1d2004c)
#define rEXTINT (*(volatile unsigned *)0x1d20050)
#define rEXTINTPND (*(volatile unsigned *)0x1d20054)
/* WATCHDOG */
#define rWTCON (*(volatile unsigned *)0x1d30000)
#define rWTDAT (*(volatile unsigned *)0x1d30004)
#define rWTCNT (*(volatile unsigned *)0x1d30008)
/* ADC */
#define rADCCON (*(volatile unsigned *)0x1d40000)
#define rADCPSR (*(volatile unsigned *)0x1d40004)
#define rADCDAT (*(volatile unsigned *)0x1d40008)
/* Timer */
#define rTCFG0 (*(volatile unsigned *)0x1d50000)
#define rTCFG1 (*(volatile unsigned *)0x1d50004)
#define rTCON (*(volatile unsigned *)0x1d50008)
#define rTCNTB0 (*(volatile unsigned *)0x1d5000c)
#define rTCMPB0 (*(volatile unsigned *)0x1d50010)
#define rTCNTO0 (*(volatile unsigned *)0x1d50014)
#define rTCNTB1 (*(volatile unsigned *)0x1d50018)
#define rTCMPB1 (*(volatile unsigned *)0x1d5001c)
#define rTCNTO1 (*(volatile unsigned *)0x1d50020)
#define rTCNTB2 (*(volatile unsigned *)0x1d50024)
#define rTCMPB2 (*(volatile unsigned *)0x1d50028)
#define rTCNTO2 (*(volatile unsigned *)0x1d5002c)
#define rTCNTB3 (*(volatile unsigned *)0x1d50030)
#define rTCMPB3 (*(volatile unsigned *)0x1d50034)
#define rTCNTO3 (*(volatile unsigned *)0x1d50038)
#define rTCNTB4 (*(volatile unsigned *)0x1d5003c)
#define rTCMPB4 (*(volatile unsigned *)0x1d50040)
#define rTCNTO4 (*(volatile unsigned *)0x1d50044)
#define rTCNTB5 (*(volatile unsigned *)0x1d50048)
#define rTCNTO5 (*(volatile unsigned *)0x1d5004c)
/* IIC */
#define rIICCON (*(volatile unsigned *)0x1d60000)
#define rIICSTAT (*(volatile unsigned *)0x1d60004)
#define rIICADD (*(volatile unsigned *)0x1d60008)
#define rIICDS (*(volatile unsigned *)0x1d6000c)
/* RTC */
#ifdef __BIG_ENDIAN
#define rRTCCON (*(volatile unsigned char *)0x1d70043)
#define rRTCALM (*(volatile unsigned char *)0x1d70053)
#define rALMSEC (*(volatile unsigned char *)0x1d70057)
#define rALMMIN (*(volatile unsigned char *)0x1d7005b)
#define rALMHOUR (*(volatile unsigned char *)0x1d7005f)
#define rALMDAY (*(volatile unsigned char *)0x1d70063)
#define rALMMON (*(volatile unsigned char *)0x1d70067)
#define rALMYEAR (*(volatile unsigned char *)0x1d7006b)
#define rRTCRST (*(volatile unsigned char *)0x1d7006f)
#define rBCDSEC (*(volatile unsigned char *)0x1d70073)
#define rBCDMIN (*(volatile unsigned char *)0x1d70077)
#define rBCDHOUR (*(volatile unsigned char *)0x1d7007b)
#define rBCDDAY (*(volatile unsigned char *)0x1d7007f)
#define rBCDDATE (*(volatile unsigned char *)0x1d70083)
#define rBCDMON (*(volatile unsigned char *)0x1d70087)
#define rBCDYEAR (*(volatile unsigned char *)0x1d7008b)
#define rTICINT (*(volatile unsigned char *)0x1d7008e)
#else
#define rRTCCON (*(volatile unsigned char *)0x1d70040)
#define rRTCALM (*(volatile unsigned char *)0x1d70050)
#define rALMSEC (*(volatile unsigned char *)0x1d70054)
#define rALMMIN (*(volatile unsigned char *)0x1d70058)
#define rALMHOUR (*(volatile unsigned char *)0x1d7005c)
#define rALMDAY (*(volatile unsigned char *)0x1d70060)
#define rALMMON (*(volatile unsigned char *)0x1d70064)
#define rALMYEAR (*(volatile unsigned char *)0x1d70068)
#define rRTCRST (*(volatile unsigned char *)0x1d7006c)
#define rBCDSEC (*(volatile unsigned char *)0x1d70070)
#define rBCDMIN (*(volatile unsigned char *)0x1d70074)
#define rBCDHOUR (*(volatile unsigned char *)0x1d70078)
#define rBCDDAY (*(volatile unsigned char *)0x1d7007c)
#define rBCDDATE (*(volatile unsigned char *)0x1d70080)
#define rBCDMON (*(volatile unsigned char *)0x1d70084)
#define rBCDYEAR (*(volatile unsigned char *)0x1d70088)
#define rTICINT (*(volatile unsigned char *)0x1d7008c)
#endif
typedef struct tagSpinButton
{
GR_WINDOW_ID wWindow;
int nValue;
int nMax;
int nMin;
int *pValue;
}SPINBUTTON;
GR_FONT_ID ChineseFont;
// 绘制按钮,这里没用它的Widget,自己绘制的按钮
void DrawButton(GR_WINDOW_ID wButton,int Width,int Height,int bDown);
// 显示时间,其实就是把一个数字显示到指定的位置里。
void PrintTimer(int nValue,int X,int Y,GR_GC_ID hDC,GR_WINDOW_ID wWindow);
// 数字转换成BCD码,这里只能处理2位数字,对于日期够用了。
int NumberToBCD(int nValue);
// 显示设置时间的对话框
void do_setup_time(GR_WINDOW_ID wRootWindow);
/******************************************************************************/
int main(int ac,char **av)
{
char szTimer[10];
int nYear=0;
int nMonth=0;
int nDay=0;
int nHours=0;
int nMinutes=0;
int nSeconds=0;
GR_WINDOW_ID w;
GR_WINDOW_ID wSetButton;
GR_GC_ID DCTimer;
GR_GC_ID DCButton;
GR_EVENT event;
if (GrOpen()<0)
{
printf("Can't open graphics\n");
exit(1);
}
rRTCCON = 1; // 允许访问RTC寄存器。
// 创建主窗口
w = GrNewWindowEx(
GR_WM_PROPS_MAXIMIZE|GR_WM_PROPS_NOAUTOMOVE, "Clock", GR_ROOT_WINDOW_ID,
10, 10, 230, 22, GrGetSysColor(GR_COLOR_BTNFACE));
// 创建设置按钮
wSetButton = GrNewWindowEx(
GR_WM_PROPS_BORDER|GR_WM_PROPS_APPFRAME,
"Set", w,
160, 1, 60, 20, GrGetSysColor(GR_COLOR_BTNFACE));
// 设置事件
GrSelectEvents(w, GR_EVENT_MASK_CLOSE_REQ | GR_EVENT_MASK_TIMEOUT);
GrSelectEvents(wSetButton, GR_EVENT_MASK_EXPOSURE | GR_EVENT_MASK_BUTTON_DOWN | GR_EVENT_MASK_BUTTON_UP);
// 显示窗口和按钮
GrMapWindow(w);
GrMapWindow(wSetButton);
// 获得绘图句柄
DCTimer = GrNewGC();
// 设置前景颜色
GrSetGCForeground(DCTimer,BLACK);
// 背景颜色
GrSetGCBackground(DCTimer,GrGetSysColor(GR_COLOR_BTNFACE));
// 创建字体,汉字的 12
// 后来找到原因了,make menuconfig里面的汉字支持设置没有
// 传递到engine的编译过程里
// 最后手动修改device.h
// 增加了
/*
#ifndef HAVE_HZK_SUPPORT
#define HAVE_HZK_SUPPORT 1
#endif
#ifndef HZK_FONT_DIR
#define HZK_FONT_DIR "/bin" //字库的存放位置,这里我放到了bin里。
#endif
才搞定,只有12和16号字可以使用。
*/
ChineseFont=GrCreateFont("HZKFONT",12,NULL);
// 选中字体
GrSetGCFont(DCTimer,ChineseFont);
// 创建按钮的绘制句柄
DCButton = GrNewGC();
// 前景、背景、字体
GrSetGCForeground(DCButton,BLACK);
GrSetGCBackground(DCButton,GrGetSysColor(GR_COLOR_BTNFACE));
GrSetGCFont(DCButton,ChineseFont);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -